让头停下来等待输入

时间:2012-07-24 10:24:23

标签: git shell sed msysgit head

我正在为git开发“custom grep”包装器。它显示了文件匹配模式的第一行。该行应该是文件的标题。

我已经创建了别名,一切正常,直到我尝试搜索模式,这在工作文件夹中找不到。由于没有找到任何文件,headsed命令无法使用,并且命令指针和等待输入。

如何防止这种情况?如果没有输入,我想脚本中断。当然,我可以创建单独的脚本,将文件列表分配给变量并检查此变量的长度。但我更喜欢甜蜜的整齐的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}"'

但表现不同。第一种方法明显更快。

2 个答案:

答案 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,这样您就可以将调用链接到headsed,如{{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}"