Гну параллельно и акк не играет красиво из-за stdin, труба

580
mgalgs

Я пытаюсь использовать parallelи ackвместе, чтобы сделать поиск параллельно. Тем не менее, ackкажется, настаивает на использовании, stdinесли он оказывается в трубе, даже если вы даете ему файлы для поиска:

$ echo hello > test.txt  $ ack hello test.txt hello  $ echo test.txt | xargs ack hello hello  $ echo test.txt | parallel ack hello {}  # ack thinks it should be searching stdin: $ echo test.txt | parallel ack -f {} -  # even though parallel is indeed passing test.txt: $ echo test.txt | parallel --dry-run ack hello {} ack hello test.txt 

Что мне нужно сделать, чтобы получить ackи parallelхорошо играть?

4
Попробуйте запустить `parallel --bibtex` один раз, чтобы избежать` --no-note`. Ole Tange 10 лет назад 1

3 ответа на вопрос

4
hoelzro

Это также происходит в текущей ветке разработчика ( 9cc2407). Причина этого заключается в том, что когда стандартный ввод является каналом, ack пытается быть полезным и предполагает, что вы пытаетесь найти этот поток ввода. Мы не видели такого поведения раньше, поэтому я включил его в список рассылки разработчиков. В то же время, вы можете использовать, --nofilterчтобы переопределить поведение Ack по умолчанию.

добавление `--nofilter` работает, спасибо! mgalgs 10 лет назад 0
2
Ole Tange

Проблема связана с этой строкой в ack:

$is_filter_mode = -p STDIN; 

Таким образом, эти две ситуации рассматриваются по-разному в ack:

cat file | ack ... ack < file ... 

Обходной путь для вас, кажется, заключается в добавлении cat:

echo test.txt | parallel cat {} \| ack hello 

Это работает в ack2.12.

0
Ole Tange

Я думаю, что ack болен: его поведение не является детерминированным, но время от времени он производит разные результаты. Здесь я запускаю одну и ту же команду 100 раз. 54 из них дают "привет: нет такого файла или каталога". Примечание ackвыполняется bashGNU Parallel.

$ seq 100 | parallel -N0 echo ack hello test.txt > test.sh $ bash test.sh 2>&1 | sort | uniq -c 54 hello: No such file or directory 100 hi 

Я могу воспроизвести это поведение, когда запускаю это вручную 100 раз:

$ ack hello test.txt <<Sometimes:>> hello: No such file or directory hi 
хм, я не могу воспроизвести эти результаты. Это соответствует для меня. mgalgs 10 лет назад 0
Я только что протестировал на Linux Mint 15 и Debian 7.0: я все еще получаю противоречивые результаты. Какой O / S вы работаете? Ole Tange 10 лет назад 0
Да. Arch Linux. `ack 2.12`,` perl 5.18.2`. mgalgs 10 лет назад 0
Я могу воспроизвести ваши выводы с помощью «ack 2.12». Ole Tange 10 лет назад 0