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

Git 使用子模块foreach时加载bash别名,git,bash,git-submodules,Git,Bash,Git Submodules,在运行git子模块foreach命令时,是否有办法使git source默认为我的.bashAlias文件 例如,我将git-no-pager grep-n化名为ggrep,我经常想用git submodule foreach“ggrep;true”搜索所有子模块,但该命令只是为每个子模块打印“ggrep:not found”。别名不用于非交互式使用,即使它们源代码到正在使用的shell中,如果没有为具有shopt-s expand\u别名的shell显式打开它们,它们在这个上下文中仍然不可用

在运行
git子模块foreach
命令时,是否有办法使git source默认为我的
.bashAlias
文件


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

别名不用于非交互式使用,即使它们源代码到正在使用的shell中,如果没有为具有
shopt-s expand\u别名的shell显式打开它们,它们在这个上下文中仍然不可用


无论如何都要使用别名 但是,如果您确实想使用别名执行此操作,您可以这样做。在
~/.bash\u配置文件中,输入以下内容:

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'

使用导出函数

如果您的BASH提供了<代码> /BI/SH <代码>,请考虑导出函数——将以下内容放在<代码> ~/.BasHyFrase中,作为例子:

ggrep() { git --no-pager grep -n "$@"; }
export -f ggrep
(与
~/.bashrc
不同,
~/.bash_profile
仅在登录shell上执行;但是,由于此命令将内容导出到环境中,因此作为子进程调用的shell将继承此类内容)


使用外部脚本 如果您没有该保证,请在路径中放置一个脚本:

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

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

也许您首先不应该使用别名……将此
ggrep
作为可执行脚本(在
PATH
变量中列出的目录中).nod.alias在非交互Shell中默认情况下是关闭的。当然,您可以打开它们…但最好只是做一些事情,少一些意外。即使是导出的函数也属于这一类,但其工作情况取决于您的
/bin/sh
是谁。我最后只是创建了一个
ggrep all
函数(而不是试图将我的别名传递给子模块foreach),基于您的警告和评论——但这完美地回答了这个问题。谢谢。顺便说一句,POSIX并不要求带破折号的函数名有效——下划线虽然有点难看,但如果您试图实现可移植性,则更安全。哦,谢谢您的提示。我已经修复了它(“最佳实践”等)。