web-dev-qa-db-ja.com

Bashスクリプト-アプリケーションを実行し、ライブ出力を表示する

いくつかの環境パラメーターを設定してからc ++アプリケーションを実行するbashスクリプトを持っています。

C++アプリケーションは、実行時に現在の状態を示す情報を出力します。

現在、実行結果が表示されるのは、実行が終了してからです。 (約1分)とにかくbashスクリプトにアプリケーションからのライブ出力を表示させる方法はありますか?

これは私がこれまでに持っているものです:

OUTPUT="$(Sudo ./test_app -release)"    
echo $OUTPUT

申し込みが完了すると、以下が表示されます。

release acknowledgereleasingstage1stage2released

コマンドラインから直接アプリケーションを実行した場合、アプリケーションが完了したときにすべてが1つになるのではなく、各プロセスが完了するたびに新しい行が表示されます。

release acknowledge
releasing
stage1
stage2
released

これを行う方法はありますか?ユーザーが複数のコマンドを実行する必要がないように、bashスクリプトからアプリを呼び出します。

ありがとう。

6
user214292

出力を表示し、保存する必要がない場合は、次のコマンドを実行します。

Sudo ./test_app -release

出力の保存と表示の両方が必要な場合は、 tee を呼び出して出力を複製します。

OUTPUT=$(Sudo ./test_app -release | tee /dev/stderr)

出力をリダイレクトすると、アプリケーションは buffer 出力を行単位ではなく大きなチャンクで出力する場合があります。行ごとのデフォルトは、出力が端末である場合のみであり、パイプや通常のファイルではありません。これがアプリケーションに当てはまる場合は、 call unbufferまたはstdbuff です。 動作方法 のため、stdbufはSudoから呼び出す必要がありますが、bufferはそのまま実行できます。

OUTPUT=$(Sudo stdbuf ./test_app -release | tee /dev/stderr)
OUTPUT=$(unbuffer Sudo ./test_app -release | tee /dev/stderr)

特定の理由で出力を保存する必要がないと仮定すると、単純に置き換えることができます。

OUTPUT="$(Sudo ./test_app -release)"    
echo $OUTPUT

Sudo ./test_app -release

シェルコマンドでは、組み込みコマンドと非組み込みコマンド(基本レベル)に特別な違いはありません。それらはすべて実行し、出力します。

2
EightBitTony