SIGQUIT 没有终止 bash 脚本的效果吗?

SIGQUIT 没有终止 bash 脚本的效果吗?
#!/bin/bash --

echo "$$"

LC_ALL=C sed 's/[!-~]/b/g' /tmp/bigfile > /tmp/outfile

echo end of script

如果我QUIT使用发送信号,Ctrl + \我会得到以下输出:

# ./script.sh
6739
^\./script.sh: line 5:  6740 Quit                    LC_ALL=C sed 's/[!-~]/b/g' /tmp/bigfile > /tmp/outfile
end of script

这会sed按预期杀死并导致核心转储,但脚本仍会继续。这是预期的行为吗?这发生在我身上,使用bashandash但不是 not dashor ksh93

答案1

是的,bash忽略SIGQUIT。引自其手动的(强调我的):

3.7.6 信号

当 Bash 是交互式的时,在没有任何陷阱的情况下,它会忽略SIGTERM(这样kill 0就不会杀死交互式 shell),并被SIGINT捕获和处理(以便wait内置命令是可中断的)。当 Bash 接收到 时SIGINT,它会跳出任何正在执行的循环。在所有情况下,Bash 都会忽略SIGQUIT。如果作业控制有效,Bash 会忽略SIGTTINSIGTTOUSIGTSTP

这是非标准行为,大多数其他 shell 不会这样做。


如果你觉得没有说服力,你可以看看它的源代码:shell_initialize()-> initialize_signals(0)-> initialize_shell_signals()->set_signal_handler (SIGQUIT, SIG_IGN)无条件地从 调用main()

相关内容