Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git高级别名参数问题_Git_Git Alias - Fatal编程技术网

git高级别名参数问题

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命令必须以终

假设我的.gitconfig别名中有:

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()