gpt4 book ai didi

git - 让 head 停止等待输入

转载 作者:太空狗 更新时间:2023-10-29 14:39:54 26 4
gpt4 key购买 nike

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

但性能不同。第一种方法明显更快。

最佳答案

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

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

不同于command substitution其中 ```cmd`` 部分被命令的输出替换,进程替换 <(cmd)` 部分被替换为包含输出的文件/管道的文件名命令。

在命令输出为空的情况下,head 仍将接收输入,即空文件/管道的文件名,并将按您预期的方式继续。

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

更新

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

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

或者,您可以简单地将 git grep 的输出通过管道传输到 xargs,这样您就可以将调用链接到 headsedpatthoyts answer 所示.

关于git - 让 head 停止等待输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11628838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com