我尝试同时使用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
玩得愉快?
答案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
这在ack
2.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