使用 DEBUG 陷阱时 INT 陷阱不起作用



以下代码是我的.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(作为命令),preexecDEBUG信号触发将首先执行以打印pre。然后SIG_INT将被发送到运行sig_int以打印sigint

最新更新