假设我在.gitconfig别名中有这个:
testing =!"\
echo \"hi\" \
"
如果我运行git testing 1 4
,它会将参数回显给我:
hi 1 4
此外,如果我使用sh来尝试获取所有参数,它不会显示第一个:
testing =!sh -c 'echo "$@"'
如果我运行git testing 1 4
,则只显示4
。
这是什么原因?
答案 0 :(得分:2)
如果您的sh
为bash
,那么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"