GNU“parallel --pipe”不按行处理标准输入

Tho*_*ner 4 pipe gnu-parallel

我对如何使用 GNU 并行将 stdin 传递给作业命令感到非常困惑。

我有一个我认为非常常见的用例。我有一些进程xxd使用标准输入执行某些操作并输出到标准输出。例如,我有某种方法可以从另一个标准流生成或获取工作,seq 3并且我可以将两者结合起来并制作一个临时的电动工具,如下所示:

$ seq 3 | while read line; do echo $line | xxd; done
00000000: 310a                                     1.
00000000: 320a                                     2.
00000000: 330a                                     3.
Run Code Online (Sandbox Code Playgroud)

伟大的。我们可以清楚地看到,每次调用都会xxd获取一行,并附加一个尾随换行符。

这就是管道的作用parallel

$ seq 3 | parallel --pipe --recend="\n" -L 1 xxd
...

00000000: 310a 320a 330a                           1.2.3.
Run Code Online (Sandbox Code Playgroud)

parallel --pipe获取所有标准输入并将其发送到一个调用,xxd这让我感到困惑,因为所有记录的参数及其默认值似乎与此行为相矛盾:(--recend="\n"默认值)通过换行符分隔作业,-L 1(默认值)最多向命令发送一行。

空分隔符也有同样的问题。它们也被逐字传递:

seq 3 | tr '\n' '\0' | parallel --null --pipe xxd
...

00000000: 3100 3200 3300                           1.2.3.
Run Code Online (Sandbox Code Playgroud)

对此行为的解释将不胜感激,特别是因为这些参数似乎专门适用于--pipe的模式parallel

Ole*_*nge 8

你太接近了。-L设置记录大小(以行为单位),但不设置应发送的记录数。这是由 控制的-N。默认--recend\n不需要的。默认-L值为 1,因此不需要。

seq 3 | parallel --pipe -N 1 xxd
Run Code Online (Sandbox Code Playgroud)