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
追加の中かっこで奇妙なコードを挿入するのはこのマクロです。