我正在尝试重定向 pv 命令的 stderr 并使用 tr 处理它,如下所示:
(dd if=/dev/zero | pv -f -r > /dev/null) 2>&1 | tr "\r" "\n"
(dd 只是一个例子)并且这段代码非常好(输出就像
[ 189MB/s]
[ 188MB/s]
[ 186MB/s]
[ 180MB/s]
)但问题是放置“|”或“>”重定向它不会导致任何内容流到目标文件或管道。我想进一步处理这个输出,但我不知道为什么会这样以及如何解决这个问题。有谁有线索吗?
您正在将
stdout
设为 /dev/null
,然后尝试将其通过管道传输到 tr
。此时输出已经丢失。去掉> /dev/null
部分
怎么样:
dd if=/dev/zero | pv -f -r 2> >(tr "\r" "\n") >/dev/null
编辑:
由于 OP 想要处理 tr(pv 的 stderr)的输出,这可以帮助:
dd if=/dev/zero | pv -f -r 2>&1 >/dev/null | tr "\r" "\n" | your_process_command
它将 stderr 重定向到 stdout,并将 stdout 重定向到 /dev/null。因此,带宽数据位于标准输出上,然后馈送到 tr。
编辑2:
抱歉,编辑也不起作用。我会尝试找到更好的方法并更新它....
dd if=/dev/zero | pv -f -r 2>&1 >/dev/null | tr "\r" "\n"
输出:
[ 270MiB/s]
[ 276MiB/s]
[ 268MiB/s]
重定向的顺序很重要。
您需要将
2>&1
放在 >/dev/null
之前。我发现这个关于它如何工作的解释很有帮助。