使用子模块 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()
到 运行 作为子进程的命令。
当 运行 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()
到 运行 作为子进程的命令。