コマンドが失敗したかどうかを確認する - リダイレクトの後か前か?

コマンドが失敗したかどうかを確認する - リダイレクトの後か前か?

STDOUT と STDERR を 2 つの別々のファイルにリダイレクトしながら実行する SQL スクリプトがあります。SQL スクリプトに最近問題が発生したため、SQL スクリプトによってエラーが返された場合は、スクリプトをエラーで終了したいと考えています。

現在は次のようになっています:

executeHiveSql insertEvent.sql --hivevar Date=${DATEYMD} > logs/inesrtEvent"${DATEYYYYMMDD}".log 2>logs/insertEvent"${DATEYYYYMMDD}".err

このSQLクエリの失敗を処理するために、条件チェックを追加したいと思います。これはリダイレクトの前に置くべきでしょうか、それとも後に置くべきでしょうか? IE

executeHiveSql insertEvent.sql --hivevar Date=${DATEYMD} > logs/inesrtEvent"${DATEYYYYMMDD}".log 2>logs/insertEvent"${DATEYYYYMMDD}".err || { echo 'Process FAILED! Please check the logs.' ; log $AUTO_JOB_NAME "Failure" 1 "Archive process FAILED..."; exit 1; }

または

executeHiveSql insertEvent.sql --hivevar Date=${DATEYMD} || { echo 'Process FAILED! Please check the logs.' ; log $AUTO_JOB_NAME "Failure" 1 "Archive process FAILED..."; exit 1; } > logs/inesrtEvent"${DATEYYYYMMDD}".log 2>logs/insertEvent"${DATEYYYYMMDD}".err

答え1

これは順序に関する質問に直接答えるものではありません。しかし、使用している構造が理解しにくい場合は、代わりにより単純な構造を使用することをお勧めします。すべてをワンライナーにすることに賞品はありません :)

if ! executeHiveSql ... > ... 2> ...; then
    echo "Process FAILED!..."
    log ...
    exit 1
fi

関連情報