if文でコマンド終了コードを確認する方法

if文でコマンド終了コードを確認する方法

コマンドがコード 143 ("Timeout Command" のタイムアウト) で終了した場合は 0 終了コードを返し、それ以外の場合は 1 を返そうとします。外部制約(CIスクリプト)のためにコマンドを起動し、ifセクションで確認する必要があります。

これが私が現在使用しているものです:

if timeout -t 10 *command* || [ $? = 143 ]
then exit 0
else exit 1
fi

現在は常にコード0で終了します。

答え1

終了ステータスが0(シェルスクリプトでtrueとして処理される終了ステータス)の場合、コマンドは終了ステータス0で完了し、正しい結果が出ないため、スクリプトは目的の操作を実行しません。実行中の手側。同様に、に変更するとtimeout -t 10 commandtimeout -t 10 command || [ $? = 143 ]||||&&0以外左側の終了状態はコマンド全体の終了状態であり、右側は実行されません。

2つの別々のコマンドで実行する必要があります。または改行で区切ります;。必要に応じてこれを実行するときに条件として使用できますif(下記参照)。

代わりに終了状態であると仮定します。timeout -t 10 commandcommand(他の場合)必要です。そうでなければ、あなたが望むものが何であるかわかりません。イルカチュウのようにtimeout、オプションを許可するコマンドに精通していません-t。通常、これを行うことをお勧めします。ただし、「外部制約」がifまったく使われていないため、禁止できるように聞こえます。

timeout -t 10 command
test "$?" -eq 143
exit

test/コマンドはtrueの場合は終了コード0、falseの場合1を返すため、別のブランチを使用して[作成する必要はありません。引数なしで実行すると、組み込みコマンドによってシェルは最後のコマンド実行の終了ステータスを返します。exit 0exit 1exit

exit制御フローがスクリプトの終わりから外れると、次のような効果があるため、すでにスクリプトの最後にある場合は省略できますexit

timeout -t 10 command
test "$?" -eq 143

(どちらの場合も、必要に応じて書き込みの[ "$?" -eq 143 ]代わりに書き込むことができます。/ usageの詳細については、以下を参照してください。)test "$?" -eq 143[test

説明がコードを完全に使用できないように聞こえても、必要な形式を取るようにコードを変更することはできます。ただできないと言う調査するだけでなくスタートコマンドif条件で。これは禁止だと思います。Hauke Lagingが提案した読みやすく慣用的なアプローチコマンドの実行今後これif

したがって、そうでない場合は、if条件にコマンドを含めることができます。ただし、aの代わりにaを使用してtest/[コマンドと区別してください。;||

if timeout -t 10 command; [ "$?" -eq 143 ]; then
    exit 0
else
    exit 1
fi

" "(周囲を省略することができます。代わりに$?書くこともできますが、数値比較ではなくテキスト比較を表すので混乱しています。必要に応じて代わりに書くことができます。)=143=test "$?" -eq 143[ "$?" -eq 143 ]

これは、ifセミコロンまたは改行文字で区切られた複数のコマンドで構成される条件を作成できるためです。これがシェル構文でthen条件の終わりを示すために作成する必要がある理由ですif。したがって、2つのコマンドを条件として実行し、2番目のコマンドのみをテストすることを目的としている場合は、&&or演算子をバイパスして使用する必要はありません。||ifif

私がこれを提案する理由は、すべてがこのif状態でなければならないと言われたからです。必要でない場合は、このようなスクリプトを作成しないことをお勧めします。

答え2

timeout -t 10 command
if [ $? -eq 143 ]; then
    exit 0
else
    exit 1
fi

関連情報