config.status
生成された次のコードスニペットを引用しましたconfigure
。
if test ! -f "$as_myself"; then
{ { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
{ (exit 1); exit 1; }; }
fi
コードスニペットでは{ (exit 1); exit 1; };
どうなりますか?サブシェルでのみ実行する目的は何ですかexit
?
答え1
実行は(exit 1);
トラップを実行する最も簡単な方法ですERR
。有効な場合はset -e
直ちにシャットダウンが発生します。 (エラー条件をトリガーするにはコマンドの失敗が必要です。サブシェルexit
の失敗値が原因でサブシェルが失敗します。)
exit 1;
そのどれもしません。
したがって、デバッグに役立つタスクを実行できるトラップを最初に作成してから、エラー表示でスクリプトを終了する{(exit 1); exit 1;}
ために使用できます。ERR
autoconf
しかし、文書ではそうではありません。autoconf
スクリプトはEXIT
トラップを使用して、実行中に生成された一時ファイルをクリーンアップします。ほとんどのシェル(含む)は、トラップを呼び出す前に、bash
コマンドに指定された値に基づいて状態を設定します。これにより、トラップはエラーまたは通常のシャットダウンで呼び出されたかどうかを検出でき、トラップ操作の終了時にシャットダウン状態が正しく設定されていることを確認できます。exit
EXIT
EXIT
しかし、明らかにいくつかの貝は協力しません。これはから来たものですautoconf
手動:
一部のシェルスクリプト(例:で生成されたスクリプト
autoconf
)は、トラップを使用して終了する前にクリーンアップします。最後のシェルコマンドがゼロ以外の状態で終了すると、トラップもゼロ以外の状態で終了し、呼び出し側がエラーが発生したことを知ることができます。残念ながら、一部のシェル(Solarisなど)では、
/bin/sh
シャットダウントラップはシャットダウンコマンドの引数を無視します。これらのシェルでは、トラップは通常のシャットダウンまたはシャットダウン1によって呼び出されたかどうかを判断できません。出口を直接呼び出すのではなく、AC_MSG_ERROR
この問題を解決するマクロを使用してください。
解決策は、$?
終了状態があることを確認することです。今後コマンドexit
が実行されるため、EXIT
トラップが実行されると確実にその値が得られます。実際、AC_MSG_ERROR
追加の中かっこで奇妙なコードを挿入するのはこのマクロです。
答え2
私が知っている限り、これを行う目的はなく、サブシェルを起動してすぐに終了しても直接取得できるものはありません。
このようなことは、自動生成されたコードの副作用である可能性が高いです。場合によっては、サブシェルで実行される他のコマンドがありますexit 1
。最終的に生成されたコードは、場合によっては機能しないいくつかのステートメントを生成されたコードに挿入することを可能にすることによってある程度単純化される可能性が高く、毎回「クリーンなコード」を生成する方が複雑になります。あるいは、上記のコードを生成するコードが正しく書かれていません。 :)
無料使用法{...}
は別の例です。ほとんどは冗長ですが、すべての場合に挿入するコードを書く方が簡単です(場合によっては、ブロックの出力/入力をリダイレクトしたい場合があります)。必要ではないものを区別し、省略してそれらを。
答え3
(exit 1)
これは特定の終了コードを取得する簡単でおそらく最も簡単な方法です(もちろん1の特別なケースではより簡単な方法があります)。ただし、この場合、終了コードは確認されないため、そうではありません。
サブシェルを置く目的は、exit
スクリプトを終了しないことです(終了は特定の終了コードを生成するために使用されますが)。