【发布时间】:2022-01-03 18:55:33
【问题描述】:
我想并行读取(seq numbers)管道,所以我想运行类似的东西:
seq 2000 | parallel --max-args 0 --jobs 10 "{ read test; echo $test; }"
相当于运行:
echo 1
echo 2
echo 3
echo 4
...
echo 2000
但不幸的是,管道没有被并行读取,这意味着它是这样运行的:
echo
echo
echo
...
echo
而且输出是空的。
有谁知道如何制作并行读取(序列号)管道?谢谢。
【问题讨论】:
-
旁白:
parallel不是 bash 的一部分;这是一个用 perl 编写的完全独立的项目。 (它的作者在这里也很活跃;适当地修改了标签,他们很可能会出现) -
另外,您可能需要
--pipe参数来并行化,或其同义词--spreadstdin,以使内容位于儿童的标准输入上,以便read可以访问它们。 (更常见的是使用 argv 而不是 stdin;我不清楚你为什么不想在这里这样做)。 -
恰恰相反,
parallel确实从管道中读取,它自己,所以read没有什么可以读取的了。此外,使用双引号,$test在parallel运行之前扩展,因此即使read成功,您在每个子进程中执行echo,而不是echo $test。 -
@CharlesDuffy 你能给我看一个并行使用 argv 的例子吗?
-
如果您暂时忘记了
parallel并且只显示了前 3-4 个实际命令,我想您会得到更接近您想要做的事情的答案> 你真的很想跑。echo是一个特例,因为 a) 它是内置的,b) 它是parallel的默认命令,这意味着您得到的答案不会对您有太大帮助。实际上,您问题的实际答案是seq 2000 | parallel或者seq 2000 | parallel echo
标签: bash curl gnu-parallel