由于 stdin、pipe,Gnu parallel 和 ack 无法正常运行

由于 stdin、pipe,Gnu parallel 和 ack 无法正常运行

我尝试同时使用parallelack进行一些并行搜索。但是,如果它发现自己在管道中,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

我需要做什么才能获得ackparallel玩得愉快?

答案1

这种情况也发生在当前的 dev 分支上(9cc2407)。原因是当标准输入是管道时,ack 会尝试提供帮助并假设您正在尝试搜索该输入流。我们之前从未见过这种行为,因此我在 ack 开发人员邮件列表中提出了这个问题。与此同时,您可以使用 来--nofilter覆盖 ack 的默认行为。

答案2

问题出在这行ack

$is_filter_mode = -p STDIN;

因此,这两种情况的处理方式不同ack

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

您的解决方法似乎是添加cat

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

这在ack2.12 中有效。

答案3

我认为 ack 有问题:它的行为不确定,但它会不时产生不同的输出。在这里,我运行了 100 次相同的命令。其中 54 次给出“hello:没有这样的文件或目录”。注意不是由 GNU Parallelack运行的。bash

$ 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

相关内容