2

我正在为 git 开发“自定义 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}"'

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

4

2 回答 2

2

要解决有关如何防止head等待不存在的输入而停止的直接问题,您可以使用进程替换而不是命令替换:

head -n1 -q <(git grep --name-only $0) | sed s/OBJECT.//

命令替换不同,其中 ```cmd `` portion is replace by the output of the command, with process substitution the<(cmd)` 部分被替换为包含命令输出的文件/管道的文件名。

在命令输出为空的情况下,head仍会收到输入,即空文件/管道的文件名,并将按预期进行。

PS请注意,您需要使用bash而不是sh才能使用进程替换。

更新

如果您的 bash 版本不支持进程替换,另一种解决问题的方法是从空文件或虚拟文件重定向内容:

head -n1 -q `git grep --name-only $0` < /dev/null | sed s/OBJECT.//

或者,您可以简单地通过管道输出 git grepto xargswhich 允许您将调用链接到headsedpatthoyts answer中所示。

于 2012-07-24T10:29:30.190 回答
2

你真的不需要 head - 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}"
于 2012-07-24T10:37:43.103 回答