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

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

我非常困惑如何使用 GNU parallel 将 stdin 传递给作业命令。

我想象中的真的常见用例。我有一些进程xxd使用 stdin 执行某些操作并输出到 stdout。我有某种方法来生成或从另一个标准流获取工作,例如seq 3,我可以将两者结合起来并制作一个即兴的电动工具,如下所示:

$ seq 3 | while read line; do echo $line | xxd; done
00000000: 310a                                     1.
00000000: 320a                                     2.
00000000: 330a                                     3.

太棒了。我们可以清楚地看到,每次调用xxd都会得到一行,并且末尾会附加一个换行符。

管道的作用如下parallel

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

00000000: 310a 320a 330a                           1.2.3.

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

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

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

00000000: 3100 3200 3300                           1.2.3.

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

答案1

你离-L纪录已经很近了。尺寸(以行为单位)但不是应该发送多少条记录。这由 控制-N。默认--recend为,\n所以不需要。默认-L为 1,所以不需要。

seq 3 | parallel --pipe -N 1 xxd

答案2

  • --pipe向作业发送标准输入,暗示--recend '\n'
  • -N1将一个捕获的输入发送到一个作业
seq 3 | parallel --pipe -N1 xxd


旧答案:

警告:这可能会破坏您的数据流,因为echo正在解释有效负载。它可能适用于 ascii 和 utf-8 编码的字符串,但我一般不会相信它!

除了管道模式外,echo(或类似)还可以将参数转换回每个作业的 stout

$ seq 3 | parallel "echo {} | xxd"
00000000: 310a                                     1.
00000000: 320a                                     2.
00000000: 330a                                     3.

相关内容