Ag Silver Searcher:在while循环中使用时的输出文件名

3
使用Bash while循环时,当使用ag编辑:版本0.33.0)时,我无法让它显示任何文件名:
#!/bin/bash
cat <<__m | while read mod; do ag --nogroup --filename --ignore=local "^use $mod" ./; done
CGI
CGI::Push
__m

输出:

use 4.08;
use 4.08;
...

当直接在命令行中执行时,它可以正常工作:
ag --nogroup --filename --ignore=local "^use CGI" ./

输出:

dir/file/ModA.pm:12:use CGI 4.08;
dir/file/ModB.pm:1:use CGI 4.08;

如何始终在一行中获取文件名?

看起来很奇怪。你有任何别名或函数控制ag吗?type -a ag显示什么? - glenn jackman
2个回答

8
您可以避免使用while read
#!/bin/bash
for mod in CGI CGI::Push ; do
     ag --nogroup --filename --ignore=local "^use $mod" ./
done

我认为你遇到的问题实际上是由于ag中的一个错误(?)导致的。在options.c文件中,它执行了以下操作:

rv = fstat(fileno(stdin), &statbuf);
if (rv == 0) {
    if (S_ISFIFO(statbuf.st_mode) || S_ISREG(statbuf.st_mode)) {
        opts.search_stream = 1;
    }
}

由于您正在运行while read,因此您的stdin不是TTY,因此opts.search_stream被设置为1。这导致opts.print_path被设置为PATH_PRINT_NOTHING。因此,以这种方式运行时,您的路径不会打印出来。也许ag需要一个选项来强制允许这样做?


谢谢你,你让我的日子不再被grep卡住了,而是让ag工作起来了(字面上可能需要花费数天的时间)。 - Randy Lam

0
根据@eddiem所说,使用解决方法而不是while read,因为while read是罪魁祸首。嗯,至少以下方式在我的电脑上运行良好。(MacOS上的ag版本2.2.0)
IFS=$'\n'
for line in `cat $filename`; do
    ag --nogroup --numbers $line
done
exit 0

再次感谢@eddiem,所有的功劳都归于他。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接