在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;
如何始终将文件名设为内联?
答案 0 :(得分:2)
您可以避免使用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
需要一个强制允许的选项吗?