4

Я пытаюсь использовать 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 чтобы хорошо играть?

3 ответа3

4

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

2

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

$is_filter_mode = -p STDIN;

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

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

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

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

Это работает в ack 2.12.

0

Я думаю, что ack болен: его поведение не является детерминированным, но время от времени он производит разные результаты. Здесь я запускаю одну и ту же команду 100 раз. 54 из них дают "привет: нет такого файла или каталога". Заметьте, что ack запускается bash не GNU 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .