回答:
trap "$instructions" SIGSEGV
シェル自体のセグメンテーション違反をトラップします。
でスクリプトを実行する場合set -e
、トラップEXIT
(または0
)を設定できます。これは、スクリプトが終了したときに実行されます(コマンドがゼロ以外のステータスを返したためか、明示的に呼び出すexit
か、スクリプトの最後から落ちた場合)。セグメンテーション違反をテスト$?
するには、トラップへのエントリを確認します。($?
プログラムがステータス139で正常に戻ったため、139になる可能性があることに注意してください。これは、シェルで処理を行う場合は回避できます。)
set -e
trap 'case $? in
139) echo "segfault occurred";;
esac' EXIT
bashまたはkshまたはzshではset -e
、ゼロ以外のステータスを返す各コマンドの後にトラップを実行するためにを使用する必要はありませんERR
。代わりにトラップを置くことができます。以前と同様に、$?
トラップへのエントリをチェックする必要があります。139は、プログラムがこのステータスを返したことを意味する場合があります(ほとんどありません)。
からman bash
:
trap [-lp] [[arg] sigspec ...]
The command arg is to be read and executed when the shell
receives signal(s) sigspec.
プログラムがsegfaultするとき、SIGCHLD
何らかの子が(なんらかの方法で)終了したため、bashはを取得します。
ただし、$?
いくつかの条件付きでtrap に格納されているexitcodeを使用できますSIGCHLD
。
trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD
set -bm
これ(おそらく何をするか)が非対話型bash(スクリプトなど)で使用される場合に必要になる可能性があることに注意してください。
編集:およびを使用した同様の問題については、この(ギレスの)回答も参照してください。bash
trap
trap "echo 'something happened'" {1..31}
私にとっては機能します(!
およびにつながる信号仕様を除外bash: trap: XX: invalid signal specification
)
trap "echo 'something happened!'" {1..64}
てもまだ何も得られません。私もでtryiedset -bm
やset -o monitor
けど灘。