テスト後に最後の終了状態を維持する方法

テスト後に最後の終了状態を維持する方法

$?テスト後、最後のコマンドの終了ステータス()を変更せずに維持できますか?

たとえば、次のことをしたいと思います。

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要求された機能と一致するように適切なステートメントに置き換えてください。)

おすすめ記事