Bash进程替换的行为与命名管道不同吗?

时间:2020-05-19 22:30:56

标签: named-pipes tr process-substitution pv

this question的后续活动。我使用bash进程替换,期望看到5行输出(对应于5s超时),但是我只看到4行:

timeout 5s dd if=/dev/random | pv -fr > /dev/null 2> >(tr '\r' '\n' >&2)
[5.42kiB/s]
[1.89kiB/s]
[5.36kiB/s]
[2.41kiB/s]

但是,如果我在中间放置一个命名管道,则会按预期得到5行。第一个外壳:

mkfifo testfifo
cat testfifo | tr '\r' '\n' >&2

第二个外壳:

timeout 5s dd if=/dev/random | pv -fr > /dev/null 2> testfifo

第一个shell的输出(5行):

[3.79kiB/s]
[3.12kiB/s]
[ 4.4kiB/s]
[2.05kiB/s]
[5.58kiB/s]

为什么使用bash进程替换时我没有得到5行?

奖励

我还尝试将输出转储到文件而不是,但这给了我一个空的日志文件:

timeout 5s dd if=/dev/random | pv -fr > /dev/null 2> >(tr '\r' '\n' > rates.log)

我发现使用时,我的rates.log文件包含多行输出,如最初预期的那样:

timeout 5s dd if=/dev/random | pv -fr > /dev/null 2> >(stdbuf -oL tr '\r' '\n' > rates.log)

为什么我的需要stdbuf? (另请注意,该文件包含4行,因此此调用结构可能会遇到与上述相同的问题)

0 个答案:

没有答案