git高级别名参数问题

时间:2015-06-18 05:23:28

标签: git git-alias

假设我在.gitconfig别名中有这个:

testing =!"\
echo \"hi\" \
"

如果我运行git testing 1 4,它会将参数回显给我:

hi 1 4


此外,如果我使用sh来尝试获取所有参数,它不会显示第一个:

testing =!sh -c 'echo "$@"'

如果我运行git testing 1 4,则只显示4


这是什么原因?

2 个答案:

答案 0 :(得分:2)

如果您的shbash,那么Bash man page会有一些信息:

  

-c string

     

如果存在-c选项,则从字符串中读取命令。如果字符串后面有参数,则将它们分配给位置参数,从$ 0开始。

在您有机会访问$@之前,Bash会解释-c并将后续参数作为参数传递给子shell。这意味着$0将是传递的下一个值,即4(此时$@$0相同,因为只有一个值。)

如果您使用sh运行-v,您会看到有关正在发生的事情的更多信息:

$ git testing 1 4
echo $@
4

所以echo $@的参数只有4。 -c将创建一个子shell,然后传递$@。记住,现在只包含4个。这是你失去1的地方。

答案 1 :(得分:1)

我刚刚测试过:

testing = !sh -c 'echo "$@"' {};

这会显示所有参数。

这类似于“find: missing argument to -exec

  

-exec命令必须以;终止(因此您通常需要输入\;';'以避免shell解释)

这也可行:

[alias]
    testing = "!f() { echo \"$@\"; }; f"
相关问题