2016-12-05 9 views
1

При использовании ag (редактирования: версия 0.33.0) в Bash в то время как цикл я не могу сделать его показать мне какие-либо имена файлов:Ag Серебро Searcher: имя выходного файла при использовании в то время как петли

#!/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

Выглядит странно. Есть ли у вас какие-либо псевдонимы или функции, управляющие аг? Что говорит 'type -a ag'? –

ответ

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 нуждается в возможности принудительно разрешить это?