如何在git别名中使用bash函数?

20 浏览
0 Comments

如何在git别名中使用bash函数?

我想在git别名中使用一个bash函数。所以我在我的.bashrc中添加了以下内容:\n

fn() {
    echo "Hello, world!"
}
export -f fn

\n并且在我的.gitconfig中添加了以下内容:\n[alias]\n fn = !fn\n\n但是,git fn会产生一个错误:\n

fatal: cannot run fn: No such file or directory
fatal: While expanding alias 'fn': 'fn': No such file or directory

\n这种方式在git别名定义中使用bash函数是正确的吗?

0
0 Comments

问题的原因是在使用git别名时,如果想要使用bash函数,必须确保使用的shell是bash,而不是/bin/sh。因为如果使用的是ash或dash,它们不会执行bash函数。

解决方法是在.gitconfig文件中使用bash来调用函数。具体步骤如下:

1. 定义bash函数,并使用export -f命令将函数导出:

fn() { echo "hello, world"; }
export -f fn

2. 在.gitconfig文件中添加别名,并使用bash -c命令来调用函数:

[alias]

fn = !bash -c 'fn \"$@\"'

3. 为了正确传递参数,需要提供一个虚拟参数作为$0。可以使用如下命令添加别名:

git config --global alias.fn $'!bash -c \'fn "$@"\' x'

4. 如果导出函数不起作用,可以将函数添加到~/.bashrc文件中,并使用$'bash -ic \'...'来调用函数。

需要注意的是,如果出现两个不同版本的bash,一个有shellshock的供应商或中间上游补丁,另一个有最终上游补丁,可能会导致导出函数失败。因为导出函数的环境表示在shell的生命周期内并不是不变的。

通过以上步骤,就可以在git别名中使用bash函数了。

0
0 Comments

在使用.gitconfig文件中定义git别名时,如果在函数名之前加上空格,就可以正常工作并输出消息。这可能是git中的一个bug,或者是我在文档中漏掉了某些内容。

解决方法:在.gitconfig文件中定义git别名时,在函数名之前加上空格,即可正常工作。

0
0 Comments

问题的出现原因是因为git使用的是/bin/sh,所以你的.bashrc没有被调用。解决方法是在git别名中调用bash,如此回答中所述。问题在于git命令启动的bash shell不会加载你的.profile(它负责包含.bashrc)。可能还有其他方法可以解决这个问题,但你可以通过以下方式解决:

[alias]

fn = !bash -c 'source $HOME/.my_functions && fn'

将文件.my_functions设置如下:

#!/bin/bash
fn() {
    echo "Hello, world!"
}

如果你希望在常规shell中使用这些函数,则甚至可以将.my_functions源到.bashrc中。如果你在用户的dotfiles中运行它,然后尝试从子进程中访问先前导出的函数,则不需要export -f。这基本上可以工作。要将shell中的所有参数传递给fn,你需要在末尾加上`-`:

fn = !bash -c 'source $HOME/.my_functions && fn' -

完整文章如下:

How to use a bash function in a git alias?

问题的出现原因是因为git使用的是/bin/sh,所以你的.bashrc没有被调用。解决方法是在git别名中调用bash,如此回答中所述。问题在于git命令启动的bash shell不会加载你的.profile(它负责包含.bashrc)。可能还有其他方法可以解决这个问题,但你可以通过以下方式解决:

[alias]

fn = !bash -c 'source $HOME/.my_functions && fn'

将文件.my_functions设置如下:

#!/bin/bash
fn() {
    echo "Hello, world!"
}

如果你希望在常规shell中使用这些函数,则甚至可以将.my_functions源到.bashrc中。如果你在用户的dotfiles中运行它,然后尝试从子进程中访问先前导出的函数,则不需要export -f。这基本上可以工作。要将shell中的所有参数传递给fn,你需要在末尾加上`-`:

fn = !bash -c 'source $HOME/.my_functions && fn' -

0