有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行?
奖励
我还尝试将输出转储到文件而不是stderr,但这给了我一个空的日志文件:
timeout 5s dd if=/dev/random | pv -fr > /dev/null 2> >(tr '\r' '\n' > rates.log)
我发现使用stdbuf时,我的rates.log
文件包含多行输出,如最初预期的那样:
timeout 5s dd if=/dev/random | pv -fr > /dev/null 2> >(stdbuf -oL tr '\r' '\n' > rates.log)
为什么我的tr需要stdbuf? (另请注意,该文件包含4行,因此此调用结构可能会遇到与上述相同的问题)