1. ホーム
  2. bash

[解決済み] Bashでパイプ出力と終了ステータスをキャプチャする

2022-03-21 12:54:23

質問

Bashで長時間実行するコマンドを実行し、その終了状態をキャプチャしたい。 ティー の出力です。

そこで、私はこうしています。

command | tee out.txt
ST=$?

問題は、変数STが終了ステータスを捕捉するのは tee であり、コマンドのものではありません。どうすれば解決できますか?

なお、コマンドは長時間実行されるため、出力をファイルにリダイレクトして後で見るというのは、私にとっては良い解決策ではありません。

解決方法は?

Bashの内部変数に $PIPESTATUS これは、最後のフォアグラウンド・パイプラインのコマンドの各コマンドの終了ステータスを保持する配列です。

<command> | tee out.txt ; test ${PIPESTATUS[0]} -eq 0

また、他のシェル(zshなど)でも動作する別の方法として、pipefailを有効にすることができます。

set -o pipefail
...

最初のオプションは ない で動作します。 zsh というのは、構文が少し違うからです。