以前のコマンド(tar)も失敗した場合にawkが失敗するようにするにはどうすればよいですか?

以前のコマンド(tar)も失敗した場合にawkが失敗するようにするにはどうすればよいですか?

tarファイルを抽出し、1秒あたりに抽出されたファイル数を印刷する次のコマンドには、いくつかの問題があります。

tar -xvf some_tar.tar -C a/directory | awk 'systime() > lasttime { lasttime = systime(); printf "%d files\n", NR; fflush(stdout) }'

tarコマンドが失敗しても、awkコマンドはまだ0を返しますが、これはtarコマンドの失敗を反映していないため、望ましくありません。

この問題をどのように解決できますか?

ベストアンサー1

pipefailパイプラインのコマンドが失敗したことを確認するには、このオプションを設定します。 Bashに加えて、ksh、zsh、およびBusybox(少なくとも)もこれをサポートします。このオプションが設定されている場合、パイプの終了状態は、関連コマンドによって返される最も左側のゼロ以外の終了状態です。

$ set -o pipefail
$ (exit 123) | true
$ echo $?
123

あるいは、パイプは条件付きです(「失敗しました」とマークする必要があります)。

set -o pipefail
if false | true; then
    echo it succeeded
else
    echo it failed
fi

おすすめ記事