Bashスクリプト - アプリケーションを実行し、リアルタイム出力を表示します。

Bashスクリプト - アプリケーションを実行し、リアルタイム出力を表示します。

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

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

現在は、実行が完了した後にのみ結果が表示されます。 (約1分)bashスクリプトにアプリケーションのリアルタイム出力を表示させる方法はありますか?

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

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

申し込みが完了すると、次の情報が届きます。

release acknowledgereleasingstage1stage2released

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

release acknowledge
releasing
stage1
stage2
released

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

ありがとうございます。

答え1

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

sudo ./test_app -release

出力を保存して表示するには、次のように呼び出します。tee出力をコピーします。

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

出力をリダイレクトすると、アプリケーションはバッファー1行ずつ出力せずに塊単位で出力します。 Line-by-lineは、出力が端末の場合にのみデフォルト値であり、出力がパイプまたは通常のファイルの場合はデフォルト値ではありません。申請書に該当する場合は、電話unbufferするかstdbuff。なぜなら彼らがどのように機能するかstdbufsudoを介して呼び出す必要があり、buffer以前のように実行できます。

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

答え2

特定の理由で出力を保存する必要がないと仮定すると、簡単に変更できます。

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

そして

sudo ./test_app -release

組み込みコマンドと非組み込みコマンド(デフォルトレベル)のシェルスクリプトには特別な違いはありません。彼らはすべて、物事を実行して出力します。

関連情報