web-dev-qa-db-ja.com

最後のコマンドの終了コードを処理する正しい方法は何ですか?

私は現在、POSIXシェルスクリプトでこれを行っています。

success=false

pv --wait "$input_filename" | openssl enc -aes-256-cbc -d -salt -out "$output_filename" && success=true

if [ "$success" = "true" ]
...

問題は、これを正しく行うかどうかはよくわかりません。

たとえば、そのアプローチと$?をチェックするだけの違いはわかりません。

なぜ私は気にしますか?

まあ、 ShellCheck.net が私に警告したので:

SC2181 終了コードを直接確認します。 'if mycmd;'、間接的に$?ではありません。

3

あなたが投稿したリンクによると、それは次のようなものになるはずです:

if pv --wait "$input_filename" | openssl enc -aes-256-cbc -d -salt -out "$output_filename"; then
        code for true
else
        code for false
fi

私のテストでは、これはパイプラインの問題である可能性があります。opensslを使用すれば問題ないと思いますが、catechoパイプラインの最後のコマンドは成功して終了するため、常に成功として扱われると思います。

成功時または失敗時に実行するコマンドが1つしかない場合は、次のようなものも機能する可能性があります。

command && code for success 

または

command || code for failure
5
jesse_b