Linux sh trap SIGINT失败,但trap SIGQUIT成功

Linux sh trap SIGINT失败,但trap SIGQUIT成功,linux,shell,signals,Linux,Shell,Signals,我想捕获CtrL+c和CtrL+\,然后将下面的cmd添加到我的脚本中: trap _trapException SIGINT SIGQUIT function _trapException(){ echo "The job is canceled!" exit } 但是,这可以捕获CtrL+\但不能捕获CtrL+c, 我删除了SIGQUIT,它仍然不能捕获CtrL+c 否则,我同时在脚本中使用了tee函数。处理程序函数和陷阱调用都很好。当您第一次提出SIGINT或SIGQUIT时,将

我想捕获CtrL+c和CtrL+\,然后将下面的cmd添加到我的脚本中:

trap _trapException SIGINT SIGQUIT
function _trapException(){
  echo "The job is canceled!"
  exit
}
但是,这可以捕获CtrL+\但不能捕获CtrL+c, 我删除了SIGQUIT,它仍然不能捕获CtrL+c


否则,我同时在脚本中使用了tee函数。

处理程序函数和陷阱调用都很好。当您第一次提出
SIGINT
SIGQUIT
时,将调用该函数。但是,在信号处理程序中,您也在调用
exit
。这意味着这将扼杀整个过程


尝试从函数
\u trapException

中删除
exit
调用。Blue Moon当我重写演示代码以重现它时,我发现了问题的原因。演示如下: test.sh

虽然trap_test.sh也有一个trap函数,但该函数如下所示:

#!/bin/shell
trap test SIGINT SIGQUIT
function test(){
    echo "trap test!"
    exit 1
 }

 while true
 do
    echo "test"
    sleep 10
 done
当我运行sh test.sh时,trap CtrL+c失败,但是trap CtrL+\success; 当我删除trap_test.sh中的trap代码时,它可以在运行sh test.sh时捕获这两个信号


深层次原因仍然未知?

我不明白为什么在删除
退出
后它不起作用。你能发一个简短的代码来重现这个问题吗?对不起,输入框太小了,我在下面添加了描述。您是如何在几分之一秒内向程序发送信号的?您从
test.sh
调用
exit
,它将被杀死。您从命令行发送的任何信号都将被
test.sh
接收。我无法重现你的问题。你的
sh
?GNUBash(bdsh),版本3.00.22(2)-发行版(x86_64-redhat-linux-GNU)我更新trap_test.sh(全部内容)和test.sh,然后你可以再次运行它们,演示只是为了显示问题,我真正的脚本可能有这样的错误,我删除了
trap
标记,因为它没有描述shell的
trap
,而是描述了其他东西。
#!/bin/shell
trap test SIGINT SIGQUIT
function test(){
    echo "trap test!"
    exit 1
 }

 while true
 do
    echo "test"
    sleep 10
 done