Bashで139(セグメントエラー)を返すプログラムをキャッチする方法は?

Bashで139(セグメントエラー)を返すプログラムをキャッチする方法は?

いくつかのプログラムをテストするためのbashスクリプトがあり、プログラムの1つが返されるので、Segmentation faultスクリプトヘッドにトラップを追加してみました。

trap "echo 'segfault occured!'" SIGSEGV

しかし、これは何の効果もありませんでした。使った

echo $?

segfaultを生成するプログラムの直後に139出力として。この特定のエラーコードのトラップをどのように追加できますか?

答え1

trap "$instructions" SIGSEGVシェル自体から分割エラーをキャッチします。

でスクリプトを実行すると(または)トラップを配置できますset -e。スクリプトが終了したときに実行されます(ゼロ以外の状態を返すコマンドのため、明示的な呼び出しまたはスクリプトの終わりから外れた場合)。分割エラーをテストするには、トラップのエントリポイントを確認してください。 (プログラムは正常に状態139に返されるため、おそらく139です。シェルで実行している場合はこれを回避できます。)EXIT0exit$?$?

set -e
trap 'case $? in
        139) echo "segfault occurred";;
      esac' EXIT

set -eBash、ksh、またはzshでは、ゼロ以外の状態を返すすべてのコマンドの後にトラップを実行する必要はなく、代わりにトラップを配置できますERR。以前と同様に、$?トラップのエントリポイントを確認する必要があります。 139は、(まれに)プログラムがこの状態を返したことを意味します。

答え2

から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はエラーを受け取ります。

$?ただし、特定の条件とトラップに保存されている終了コードを使用できますSIGCHLD

trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD

set -bm非対話型bash(スクリプトなど)でこの機能(何ができるか)を使用している場合は、これを行う必要があります。

編集する:また、見ることができますこの(ザイルズの)答え同様の質問にはとbashを使用してくださいtrap

関連情報