`{ {(1番出口);どういう意味ですか? 1番出口}「どういう意味ですか?

`{ {(1番出口);どういう意味ですか? 1番出口}「どういう意味ですか?

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コマンドに指定された値に基づいて状態を設定します。これにより、トラップはエラーまたは通常のシャットダウンで呼び出されたかどうかを検出でき、トラップ操作の終了時にシャットダウン状態が正しく設定されていることを確認できます。exitEXITEXIT

しかし、明らかにいくつかの貝は協力しません。これはから来たものですautoconf手動:

一部のシェルスクリプト(例:で生成されたスクリプトautoconf)は、トラップを使用して終了する前にクリーンアップします。最後のシェルコマンドがゼロ以外の状態で終了すると、トラップもゼロ以外の状態で終了し、呼び出し側がエラーが発生したことを知ることができます。

残念ながら、一部のシェル(Solarisなど)では、/bin/shシャットダウントラップはシャットダウンコマンドの引数を無視します。これらのシェルでは、トラップは通常のシャットダウンまたはシャットダウン1によって呼び出されたかどうかを判断できません。出口を直接呼び出すのではなく、AC_MSG_ERRORこの問題を解決するマクロを使用してください。

解決策は、$?終了状態があることを確認することです。今後コマンドexitが実行されるため、EXITトラップが実行されると確実にその値が得られます。実際、AC_MSG_ERROR追加の中かっこで奇妙なコードを挿入するのはこのマクロです。

おすすめ記事