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