コマンドが停止するまでリアルタイムで更新されるプログレスバーを出力し、そのプログレスバーの割合を引き続き取得し、それをGUI(例:zenity)に表示したい場合はどうすればよいですか。
コマンドの最後でそれを取得して変数に保存する方法を知っています。これはこのサイトのほとんどの質問に出てくる質問ですが、コマンドの実行中にこれを実行したいと思います。
多くのゲームランチャーやアプリストアなど、すでに多くのアプリがこの機能をしているので可能なことだと思います。もう一度、どうやって同じことを続けることができますか?
答え1
コマンドの出力をリアルタイムで別のコマンドに送信することは、通常、パイプを使用して実行されます。
進行状況バーの形式がwget
コメントで話したのと同じ場合:
[...]
92750K .......... .......... .......... .......... .......... 12% 3.81M 3m31s
92800K .......... .......... .......... .......... .......... 12% 4.36M 3m29s
92850K .......... .......... .......... .......... .......... 12% 4.05M 3m28s
92900K .......... .......... .......... .......... .......... 12% 4.04M 3m26s
92950K .......... .......... .......... .......... .......... 12% 3.86M 3m25s
93000K .......... .......... .......... .......... .......... 12% 3.98M 3m24s
93050K .......... .......... .......... .......... .......... 12% 3.86M 3m23s
93100K .......... .......... .......... .......... .......... 12% 3.31M 3m22s
[...]
出力がttyに送信されない場合は、次のことができます(GNU仮定grep
)。
wget ... 2>&1 |
grep --line-buffered -Po ' \K\d+(?=%)' |
zenity --progress
つまり、パーセンテージ番号を抽出してzenity
stdinに送信します。
メモ:
2>&1
asはwget
stderrに進行状況バーを印刷します(非常に一般的です)。--line-buffered
それ以外の場合、その出力はttyデバイスに送信されないため、そのgrep
出力はバッファリングされます。