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
但纳达。