実行(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
は、終了トラップはexitコマンドの引数を無視します。これらのシェルでは、トラップは、単純な出口で呼び出されたか、出口1で呼び出されたかを判別できません。出口を直接呼び出す代わりにAC_MSG_ERROR
、この問題の回避策があるマクロを使用してください。
回避策は、コマンドが実行される前に$?
終了ステータスを確認し、トラップが実行されたときに確実にその値になるようにすることです。そして、確かに、それはその好奇心code盛なコードを挿入するマクロです。exit
EXIT
AC_MSG_ERROR
false
代わりに単に実行しないの(exit 1)
ですか?