コマンド実行中にコマンドの出力をどのように読み取ることができますか?

コマンド実行中にコマンドの出力をどのように読み取ることができますか?

コマンドが停止するまでリアルタイムで更新されるプログレスバーを出力し、そのプログレスバーの割合を引き続き取得し、それを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

つまり、パーセンテージ番号を抽出してzenitystdinに送信します。

メモ:

  • 2>&1asはwgetstderrに進行状況バーを印刷します(非常に一般的です)。
  • --line-bufferedそれ以外の場合、その出力はttyデバイスに送信されないため、そのgrep出力はバッファリングされます。

関連情報