終了コマンドの終了コードをキャプチャします。

終了コマンドの終了コードをキャプチャします。

Bashスクリプトには次のものがあります。

exit 3;

exit_code="$?"

if [[ "$exit_code" != "0" ]]; then
    echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
    exit "$exit_code";
fi

コマンドを終了した直後に終了するように見えますが、これは意味があります。すぐに終了せずに終了コードを提供できる簡単なコマンドがあるかどうか疑問に思います。

もともと推測したかったです。

exec exit 3

しかし、エラーメッセージが表示されますexec: exit: not found。どうですか? :)

答え1

プログラムを実行してプログラムの終了状態を確認するスクリプトがあり、次のようにして  $?スクリプトをテストする場合単に実行すると、$?既知の値(たとえば)に設定されます。3

(exit 3)

括弧はサブシェルを生成します。その後、このexitコマンドを使用すると、サブシェルは指定された終了状態で終了します。

答え2

exitbashに組み込まれているので、execそれはできません。すべてバッシュマニュアル:

Bashの終了ステータスは、スクリプトで実行された最後のコマンドの終了ステータスです。コマンドが実行されない場合、終了ステータスは 0 です。

exit $MY_EXIT_STATUSこれらすべてをまとめると、必要な終了状態を変数に保存してから、適切なときに保存することが唯一のオプションだと言いたいと思います。

答え3

引数として提供された状態を返すか、255何も指定されていない場合は関数を書くことができます。 (私はretこれを値を「返す」と呼びます。)

ret() { return "${1:-255}"; }

retの呼び出しを置き換えるために使用しますexit。これにより、現在受け入れられている回答でサブシェルを生成する非効率性が防止されます。

いくつかの測定。

time bash -c 'for i in {1..10000} ; do (exit 3) ; done ; echo $?'

私のコンピュータでは約3.5秒かかります。

 time bash -c 'ret(){ return $1 ; } ; for i in {1..10000} ; do ret 3 ; done ; echo $?'

私のコンピュータでは約0.051秒かかりますが、これは70倍高速です。基本処理を使用すると、まだ60倍速くなります。明らかに、ループには少しオーバーヘッドがあります。ループ本文を次に変更するか、時間を0.025に半分に減らすと、完全に空の:ループtrueは無効な構文です。;:ループに追加すると、この最小コマンドには0.007秒かかり、ループオーバーヘッドは約0.018です。両方のテストでこのオーバーヘッドを減算すると、このretソリューションが100倍以上速いことがわかります。

明らかに、これは組み合わせた測定ですが、状況は合計されます。すべてを必要以上に100倍遅くすると、システムが遅くなります。 0.0

答え4

awkを使用してこれを行うことができます。

awk 'BEGIN{exit 9}'

またはSed:

sed Q9 /proc/stat

関連情報