我正在尝试制作一个git别名来输出.git/info/exclude
的内容,减去注释。我正在使用:
[alias]
excluded = !sh -c 'cat .git/info/exclude | grep -v "#"'
但这只是返回grep的用法描述。该行在git别名之外执行良好。
第一:!sh -c ...
有点冗余,因为!
的意思是";将其余部分穿过外壳";。这里使用CCD_ 4的唯一原因是;外壳";您的Git选择的不是sh
,并且您明确需要sh
。
现在,如果你这样做,它失败的原因应该更明显:
[alias]
test = !sh -c 'echo "pound sign #"'
按原样运行,首先自己运行,然后使用GIT_TRACE=1
显示谁吃掉了角色,它会生成:
$ git test
pound sign
$ GIT_TRACE=1 git test
16:54:54.313367 git.c:702 trace: exec: git-test
16:54:54.314881 run-command.c:663 trace: run_command: git-test
16:54:54.318006 run-command.c:663 trace: run_command: 'sh -c '''echo pound sign #''''
pound sign
正如您所看到的,Git本身将文本'echo pound side #'
作为sh -c
的(单个(参数。错误在于shell:它应该吃掉#
,因为这是一个注释:
#! /bin/sh
# everything with # is a comment
echo like this # comment about the echo
如果必须通过#
,则需要从shell中引用它,即在它前面加一个反斜杠。当然,要通过Git获得反斜杠,您必须引用它,即在它前面加一个反斜杠:
[alias]
test = !sh -c 'echo "pound sign \#"'
将其应用于您自己的别名(并删除前面提到的sh -c '...'
部分(会产生:
[alias]
excluded = !cat .git/info/exclude | grep -v "\#"
它工作,但有一个UUOC(无用的使用猫(:
excluded = !grep -v "\#" .git/info/exclude
足够了。(似乎没有办法在不使用双引号的情况下引用#
,即使这样,我们也必须始终保护它不受外壳的影响。(