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
exit
bashに組み込まれているので、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