$?
テスト後、最後のコマンドの終了ステータス()を変更せずに維持できますか?
たとえば、次のことをしたいと思います。
command -p sudo ...
[ $? -ne 1 ] && exit $?
最後の項目はexit $?
sudo終了ステータスを返す必要がありますが、常に返されます0
(テスト済みの終了コード)。
一時変数なしでこれを実行できますか?
さらなる説明のための別の例:
spd-say "$@"
[ $? -ne 127 ] && exit $?
127
この場合、最初のコマンドが見つかったら終了(終了コード!=)したいと思います。実際のspd-say
終了コードで終了したいと思います(おそらくではありません0
)。
編集:より良い移植性のためにPOSIX互換ソリューションを好むという事実に言及することを忘れました。
私はスクリプトでこの設定を使用しており、同じコマンドに代わるものを提供したいと思います。たとえば、crc32スクリプト。
一時変数の問題は、他の変数を隠すことができ、長い名前を使用しないためにコードの読みやすさに悪いことです。
ベストアンサー1
実際の要件に応じて、追加のオーバーヘッドなしでシャットダウン状態を確実に処理するためのいくつかのオプションがあります。
変数を使用して終了ステータスを保存できます。
command -p sudo ...
rc=$?
[ "$rc" -ne 1 ] && echo "$rc"
成功または失敗を直接表示できます。
if command -p sudo ...
then echo success
else echo failure
fi
または、case
終了ステータスを区別するために構文を使用します。
command -p sudo ...
case $? in
(1) ... ;;
(127) ... ;;
(*) echo $? ;;
esac
質問で提起された特別な場合:
command -p sudo ...
case $? in (1) :;; (*) echo $?;; esac
これらすべてのオプションの利点は、POSIXと互換性があることです。
echo
(注:説明を簡単にするために上記のコマンドを使用しました。exit
要求された機能と一致するように適切なステートメントに置き換えてください。)