我正在为git开发“custom grep”包装器。它显示了文件匹配模式的第一行。该行应该是文件的标题。
我已经创建了别名,一切正常,直到我尝试搜索模式,这在工作文件夹中找不到。由于没有找到任何文件,head
和sed
命令无法使用,并且命令指针和等待输入。
如何防止这种情况?如果没有输入,我想脚本中断。当然,我可以创建单独的脚本,将文件列表分配给变量并检查此变量的长度。但我更喜欢甜蜜的整齐的oneliner-alias。
有可能吗?这是我的.gitconfig
别名部分:
[alias]
gg = !sh -c 'head -n1 -q `git grep --name-only $0` | sed s/OBJECT.//'
在Windows 7 x64,msysGit 1.7.11.1上为我提供了以下别名命令:
gg = !sh -c 'head -n1 -q `git grep --name-only $0` < /dev/null | sed s/OBJECT.//'
和
gg = !sh -c 'git grep --name-only $0 | xargs -l sed -n "1{s/OBJECT.//p}"'
但表现不同。第一种方法明显更快。
答案 0 :(得分:2)
要解决有关如何防止head
停止等待不存在的输入的直接问题,您可以使用process substitution而不是命令替换:
head -n1 -q <(git grep --name-only $0) | sed s/OBJECT.//
与command substitution不同,其中```cmd `` portion is replace by the output of the command, with process substitution the
&lt;(cmd)`部分由包含命令输出的文件/管道的文件名替换。
如果命令输出为空,head
仍然会收到一个输入,即空文件/管道的文件名,并将按照您的预期继续。
P.S。请注意,您需要使用bash
代替sh
才能使用流程替换。
如果您的bash版本不支持进程替换,另一种解决问题的方法是从空文件或虚拟文件重定向内容:
head -n1 -q `git grep --name-only $0` < /dev/null | sed s/OBJECT.//
或者,您可以简单地将git grep
的输出管道传输到xargs
,这样您就可以将调用链接到head
或sed
,如{{3}所示}。
答案 1 :(得分:2)
你真的不需要头 - sed可以独自完成这一切。
git grep --name-only $0 | sed -n "s/OBJECT.//;1p"
OP正在读取git grep返回的每个文件的第一行,所以:
git grep --name-only $0 | xargs -l sed -n "1{s/OBJECT.//;p}"