#!/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
按预期杀死并导致核心转储,但脚本仍会继续。这是预期的行为吗?这发生在我身上,使用bash
andash
但不是 not dash
or ksh93
。
答案1
是的,bash
忽略SIGQUIT
。引自其手动的(强调我的):
3.7.6 信号
当 Bash 是交互式的时,在没有任何陷阱的情况下,它会忽略
SIGTERM
(这样kill 0
就不会杀死交互式 shell),并被SIGINT
捕获和处理(以便wait
内置命令是可中断的)。当 Bash 接收到 时SIGINT
,它会跳出任何正在执行的循环。在所有情况下,Bash 都会忽略SIGQUIT
。如果作业控制有效,Bash 会忽略SIGTTIN
、SIGTTOU
和SIGTSTP
。
这是非标准行为,大多数其他 shell 不会这样做。
如果你觉得没有说服力,你可以看看它的源代码:shell_initialize()
-> initialize_signals(0)
-> initialize_shell_signals()
->set_signal_handler (SIGQUIT, SIG_IGN)
无条件地从 调用main()
。