いくつかの環境パラメータを設定してから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
。なぜなら彼らがどのように機能するか、stdbuf
sudoを介して呼び出す必要があり、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
組み込みコマンドと非組み込みコマンド(デフォルトレベル)のシェルスクリプトには特別な違いはありません。彼らはすべて、物事を実行して出力します。