git高级别名参数问题
假设我的.gitconfig别名中有:git高级别名参数问题,git,git-alias,Git,Git Alias,假设我的.gitconfig别名中有: testing =!"\ echo \"hi\" \ " 如果我运行git testing 14它会将参数返回给我: hi 1 4 另外,如果我使用sh尝试获取所有参数,它不会显示第一个: testing =!sh -c 'echo "$@"' 如果我运行git testing 14,它将只显示4 原因是什么?我刚刚测试过: testing = !sh -c 'echo "$@"' {}; 这将显示所有参数 这类似于“” -exec命令必须以终
testing =!"\
echo \"hi\" \
"
如果我运行git testing 14
它会将参数返回给我:
hi 1 4
另外,如果我使用sh尝试获取所有参数,它不会显示第一个:
testing =!sh -c 'echo "$@"'
如果我运行git testing 14
,它将只显示4
原因是什么?我刚刚测试过:
testing = !sh -c 'echo "$@"' {};
这将显示所有参数
这类似于“”
-exec
命令必须以终止代码>(因此通常需要键入\;
或';”
,以避免shell解释)
这也会起作用:
[alias]
testing = "!f() { echo \"$@\"; }; f"
如果您的sh
是bash
,则有一些信息:
-c字符串
如果存在-c选项,则从字符串中读取命令。如果字符串后面有参数,则会将它们指定给位置参数,从$0开始
在您有机会访问$@
之前,Bash将解释-c
,并将随后的参数作为参数传递给子shell。这意味着$0
将是传递的下一个值,即4(本质上$@
和$0
在这一点上是相同的,因为只有一个值)
如果使用-v
运行sh
,您将看到更多关于正在发生的事情:
$ git testing 1 4
echo $@
4
因此,echo$@
的参数中只有4个。-c
将创建一个子shell,并传递$@
。记住,现在只包含4个。这就是丢失1的地方。很好,我喜欢对参数丢失原因的精确解释。我在回答中没有提到这一点+1@VonC,谢谢你,伙计。当你处理这个案子时总是很难得到答案:)为什么$@
在任何时候都只包含4个?在Bash解释-c
时,为什么$@
只是4
而不是14
?@acanby谢谢,但我很困惑。在我的第一个示例中,为什么参数会回显给我?在我的第二个例子中,@Kyle说为什么它是4而不是14。1
和4
不是测试的两个后续参数吗?也许你的意思是$@
和$1
是相同的,因为$@
不应该包含0参数?第一个示例中的分号似乎没有什么区别,但括号起作用。为什么呢?第二个示例同样有效。@newguy{}
强制在当前shell的上下文中执行sh-c
命令,而不是创建子shell()