使用子模块 foreach 时加载 bash 别名

Load bash aliases when using submodule foreach

当 运行 git submodule foreach 命令时,有没有办法使 git 默认为我的 .bashaliases 文件?

例如,我将 git --no-pager grep -n 别名为 ggrep,我经常想用 git submodule foreach "ggrep <PATTERN>; true" 搜索所有子模块,但命令只是打印 "ggrep: not found"每个子模块。

别名不适用于非交互式使用,即使它们 来源到正在使用的 shell 中,它们仍然无法在这个上下文没有被显式打开 for that shell with shopt -s expand_aliases.


无论如何使用别名

不过,如果您真的想用别名来做到这一点,您可以这样做。在您的 ~/.bash_profile 中,输入如下内容:

export BASH_ENV=$HOME/.env ENV=$HOME/.env

...并且,在 ~/.env 中:

# attempt to enable expand_aliases only if current shell provides shopt
if command -v shopt; then
  shopt -s expand_aliases
fi

alias ggrep='git --no-pager grep -n'

使用导出函数

如果您的 /bin/sh 由 bash 提供,请考虑导出函数——将以下内容放入您的 ~/.bash_profile,例如:

ggrep() { git --no-pager grep -n "$@"; }
export -f ggrep

(与 ~/.bashrc 不同,~/.bash_profile 仅在登录 shells 时执行;但是,由于此命令将内容导出到环境中,因此 shells 作为子命令调用进程将继承此类内容)。


使用外部脚本

如果您不能保证,请在您的 PATH 中添加一个脚本:

#!/bin/sh
exec git --no-pager grep -n "$@"

请注意,这里使用 /bin/sh shebang,因为它可能比 bash 更小、更轻 shell,而 exec 用于避免额外的fork() 到 运行 作为子进程的命令。