Answers:
trap "$instructions" SIGSEGV 将分段错误捕获在外壳本身中。
如果您在下运行脚本set -e,则可以在EXIT(或0)上放置一个陷阱。它会在脚本终止时执行(无论是由于命令返回非零状态,还是由于显式调用exit或退出脚本结尾)。要测试分段错误,请检查$?陷阱的入口。(请注意$?可能是139,因为程序通常以状态139返回;如果在shell中进行处理,这是可以避免的。)
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.
当程序出现段故障时,SIGCHLD由于某些孩子退出(以任何方式),bash只会得到a 。
不过,您可以使用存储在中的退出码$?(在某些条件下)和陷阱SIGCHLD:
trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD
请注意,set -bm如果在非交互式bash(例如脚本)中使用此功能(可能的功能),则可能需要这样做。
trap "echo 'something happened'" {1..31}为我工作(省去了!和导致的信号规范bash: trap: XX: invalid signal specification)。
trap "echo 'something happened!'" {1..64},但仍然什么也没得到。我什至尝试过set -bm,set -o monitor但纳达。