パイプを介してコマンドから出力ラインを取得する

パイプを介してコマンドから出力ラインを取得する

特定のタスク(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

これで、これらのコマンドを使用するスクリプトを作成したいのですが、出力ではスクリプトメッセージが非常にすばやく消去されます。継続的に更新される進行状況を1行に表示できるnew aptやwgetなどの他のコマンドがあることを知っています。

私は私のスクリプトでこのようなステータスバーで遊んで改行文字を必要とせず、キャリッジリターン文字を配置する必要があることを発見しました。\ rこれは完全に理解されています。

次に、コマンド(ffmpegまたはfsarchiver)を使用して同じ操作を実行して出力をtr "\n" "\r"

このコマンドでステータスバーを取得する方法はありますか?

挨拶

答え1

基本的に自分の質問に答えたようです。出力をにパイプするとき BOTH AND ?trすべてパイプするのですか?stdoutstderr

答え2

これはバッファリングの問題です。

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

関連情報