【问题标题】:Load bash aliases when using submodule foreach使用子模块 foreach 时加载 bash 别名
【发布时间】:2016-06-27 16:24:42
【问题描述】:

在运行git submodule foreach 命令时,有没有办法让 git source 我的.bashaliases 文件默认?

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

【问题讨论】:

  • 也许你一开始就不应该使用别名……让这个ggrep成为一个可执行脚本(在你的PATH变量中列出的目录中)。
  • 点头。别名在非交互式 shell 中默认关闭。当然,您可以打开它们...但最好只做一些涉及较少意外的事情。即使是导出的函数也属于该类别,但其效果如何取决于您的 /bin/sh 是谁。

标签: git bash git-submodules


【解决方案1】:

别名不适用于非交互式使用,即使它们来源于所使用的 shell,如果没有明确打开它们,它们在这种情况下仍然不可用为那个外壳加上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 仅在登录 shell 上执行;但是,由于此命令将内容导出到环境中,因此作为子进程调用的 shell 将继承这些内容。


使用外部脚本

如果您没有该保证,请在您的 PATH 中添加一个脚本:

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

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

【讨论】:

  • 我最终只是根据您的警告和 cmets 创建了一个 ggrep-all 函数(而不是尝试将我的别名传递给子模块 foreach)——但这完美地回答了这个问题。谢谢。
  • 顺便说一句,POSIX 并不要求带有破折号的函数名称是有效的——下划线虽然有点难看,但如果你想便携的话会更安全。
  • 哦,谢谢你的提示。我已经修复了它(“最佳实践”等等)。
猜你喜欢
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多