我对如何使用 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
。
你太接近了。-L
设置记录大小(以行为单位),但不设置应发送的记录数。这是由 控制的-N
。默认--recend
是\n
不需要的。默认-L
值为 1,因此不需要。
seq 3 | parallel --pipe -N 1 xxd
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4094 次 |
最近记录: |