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

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

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

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

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

答え2

command -p ...
test 1 -ne $? && exit $_

を使用すると、前のコマンド$_の最後の引数に展開されます。

答え3

シェル関数を定義して使用できます。

check_exit_status()
{
    [ "$1" -ne 1 ] && exit "$1"
}

それから

command -p sudo ...
check_exit_status "$?"

$?確かにこれは引数listを複製するので、「トリック」ですcheck_exit_status

少しぎこちないように見えるかもしれませんが、そうです。 (これは問題にランダムな制約を与えたときに発生します。)柔軟性がないようですが、そうではありません。check_exit_statusより複雑になり、パラメータを追加して、終了ステータス値に対して実行するテストを通知できます。

答え4

あなたの直接の質問に答えるなら、いいえ、$?同じままにすることは不可能です。これは、あなたが間違った質問に焦点を当てていると疑われる状況の1つです。一時変数は、望ましい効果を得るための標準であり、好ましい方法です。これはあまりにも標準的なので、使用したくないと思う理由を放棄(または見直し)することをお勧めします。他のアプローチのさらなる複雑さがそれほど価値があるかどうか疑われます。

単純な好奇心で尋ねるなら、答えは「いいえ」です。

関連情報