很长一段时间,我在别名文件中有以下别名:
ignore=!([ ! -e .gitignore ] && touch .gitignore) | echo $1 >>.gitignore
这对我来说不是原创,如果你搜索它,你会看到很多地方。然而,最近,我开始对别名产生一个奇怪的问题。我忽略的任何内容都会在.gitignore文件和同一行(只有空格)中放置两次。
我进行了一些调试,发现真正发生的事情是echo $1
的调用正如您所期望的那样回显$1
,但也回显了别名的整个参数字符串。
为了测试这个,我做了一个新的别名:
eo = !echo $1
> git eo test
test test
> git eo test0 test1
test0 test0 test1
最后一行是最有趣的,因为它清楚地表明,当$1
被正确评估时,回调调用会将整个参数集添加到它上面。事实上,如果我弄乱了所有内容并将$1
更改为$9
(并且不填写$9
),我会得到:
> git eo test0 test1
test0 test1
我已经确认这发生在Git版本1.8.5到1.9.0上,我已经确认它不会发生在Git版本1.7.1中;不幸的是,我无法在1.7.1和1.8.5之间进行测试。
有没有人对这里发生的事情有任何见解?它打破了我的一些别名......
答案 0 :(得分:3)
我认为扩张不是你所期望的。让我们从您的别名开始:
eo = !echo $1
我相信git eo test
正在扩展为:
echo $1 test
然后将其扩展为:
echo test test
git查看别名的典型方法是说当我说“eo”时,我希望你运行“echo $ 1”并将所有参数传递给该命令。这允许你做像
这样的事情[alias]
k = !gitk
仍然可以将参数传递给git k
。如果你希望它的行为不同,你应该通过shell调用传递它:
[alias]
eo = !sh -c 'echo $1' -
然后你会得到预期的结果。
我认为对于你的忽略别名,你想要像
这样的东西[alias]
ignore = !sh -c 'echo "$1" >> .gitignore' -
注意:您无需触摸文件>>
即可使用,而在您的原始别名中,您可能需要使用;
而不是将触摸输出传输回echo。