以下代码是我的.bashrc的内容。仅此而已。 为什么按Ctrl + C时终端不打印sigint
?它打印pre
,所以我假设DEBUG
陷阱以某种方式优先于INT
陷阱。还是这里发生了其他事情?
trap sig_int INT;
preexec(){
trap '' DEBUG
echo pre
return 1
}
function sig_int(){
echo sigint
}
postexec() {
echo post
trap preexec DEBUG
}
PROMPT_COMMAND=postexec
shopt -s extdebug
为什么在按Ctrl + C时终端不打印签名?
不,它会在pre
后打印sigint
。我在.bashrc
的脚本头部添加了set -x
,它首先打印pre
:
$ ^C+++ preexec
+++ trap '' DEBUG
+++ echo pre
pre
+++ return 1
++ sig_int
++ echo sigint
sigint
+++ preexec
+++ trap '' DEBUG
+++ echo pre
pre
+++ return 1
++ postexec
++ echo post
post
++ trap preexec DEBUG
它打印
pre
,所以我假设调试陷阱以某种方式优先于 int 陷阱。还是这里发生了其他事情?
检查有关调试信号的另一个问题:
如果 sigspec 是 DEBUG,则命令 arg 在每个简单命令之前执行,对于命令、案例命令、选择命令、命令的每个算术,以及在第一个命令在 shell 函数中执行之前......
所以每次按Ctrl + C(作为命令),preexec
由DEBUG
信号触发将首先执行以打印pre
。然后SIG_INT
将被发送到运行sig_int
以打印sigint
。