我非常困惑如何使用 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.