通过管道获取命令的一行输出

通过管道获取命令的一行输出

有一些命令在执行某些操作时会在控制台中打印一些状态行(ffmpeg 或 fsarchiver)。

-[00][  0%][DIR     ] /boot/grub/fonts
-[00][  0%][REGFILE ] /boot/grub/fonts/unicode.pf2
-[00][  0%][REGFILEM] /boot/grub/grubenv
-[00][  0%][REGFILEM] /boot/grub/grub.cfg
-[00][  0%][REGFILE ] /boot/initrd.img-4.13.0-16-generic

现在我想构建一个使用这些命令的脚本,但输出将非常快地清除脚本消息。我知道还有其他命令,例如 new apt 或 wget,可以在一行中显示持续更新的进度。

我已经在我的脚本中玩过这样一行状态行,发现不需要换行符 \ni 需要放置回车符 \r 这完全有意义。

然后我尝试使用命令(ffmpeg 或 fsarchiver)执行相同的操作,将输出传输到tr "\n" "\r".但我发现这并没有改变什么。

有没有办法从这些命令中获取一行状态行?

问候

答案1

听起来你基本上回答了你自己的问题。当您将输出通过管道传输到 时tr,您是否同时通过管道传输了 BOTH stdoutAND stderr

答案2

这是一个缓冲问题:

while true; do date; sleep 1; done | stdbuf --output=0 tr '\n' '\r'

相关内容