如何在git别名中使用bash函数?
如何在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函数是正确的吗?
问题的原因是在使用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函数了。
问题的出现原因是因为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' -