【问题标题】:git alias to shell command cannot expand $@ correctlyshell 命令的 git 别名无法正确扩展 $@
【发布时间】:2018-09-20 05:49:30
【问题描述】:

我们可以定义git alias 来运行这样的shell命令:

[alias]
    echo = !echo
    echo2 = !echo "$1" && echo "====" && echo "${@:2}" && :

(使用最后一个&& :,因为命令行参数被git再次附加到命令中,:将它们变成no-op。)

现在我的问题是 git 如何运行这些命令。 它会生成一个 shell(如 sh)来运行它吗?

我在两台计算机上尝试了上述别名,一台ubuntu 和一台centos。在ubuntu 中,echo2 无法扩展参数${@:2},在bash 中扩展为从第二个到列表末尾的args。

我猜ubuntu 中使用了sh,但sh 是指向dash 的链接。不幸的是dash 不知道${@:2}。在 centos sh 链接到 bash 并且它可以工作。

我们能否有办法选择运行这些别名时使用的 shell?

【问题讨论】:

  • 也许你可以在你的别名前面加上 bash -c 以确保它在 bash 中运行
  • @MikhailBurshteyn,那我不知道如何正确引用预兆
  • 参数在常规(非 git)别名中也不能像您期望的那样工作:"$1"/"$@"/etc 不是指别名的参数,而是 shell 上下文中的参数在其中调用该别名

标签: git shell


【解决方案1】:

现在我的问题是 git 如何运行这些命令。它会生成一个 shell(如 sh)来运行它吗?

是的。它运行/bin/sh。见https://stackoverflow.com/a/39445884/7976758

扩展参数${@:2}失败

使用参数运行别名有两种方法:使用另一个级别的 shell 或使用 shell 函数。例子:

[alias]
    echo3 = !bash -c 'echo "$0" && echo "====" && echo "${@:1}"'
    echo4 = !"f() { echo \"$1\" && echo \"====\" && echo \"${@:2}\"; }; f"

别名echo4 声明一个函数并运行它。最后一个 f 运行 功能。

【讨论】:

  • 您可以通过使用shift: echo "$1" && shift && echo "$@" 消除对bash 扩展${@:2} 的需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多