bash trap 会从键盘 Ctrl-C 回显而不是 kill 2

bash trap will echo from keyboard Ctrl-C while not kill 2

假设我有一个脚本:

#!/bin/bash
# test_trap.sh

trap "echo SIGINT captured!" SIGINT
echo $$

sleep 1000

我知道 trap COMMAND 只会在 sleep 1000 收到 SIGINT 信号后执行。但是当我按下键盘 Ctrl-C:

时,陷阱命令将被执行
> sh test_sh.sh
50138
^CSIGINT captured!

而使用 kill -s SIGINT 则不会。

我在这里错过了什么?

bash 版本是 GNU bash, 4.2.46(2)-release

使用 kill -s SIGINT 50138,您 将信号发送到 shell 的进程,并且必须等待 sleep 1000结束,因为sleep没有收到信号。

但是,

Control-C 会导致终端向当前进程组中的每个进程发送 SIGINT,因此您的 shell 脚本 sleep收到。在 sleep 完成之前,您的脚本仍然不会处理陷阱命令,但是 sleep 会立即退出以响应刚刚从终端收到的 SIGINT

如果你的kill支持,你也可以使用kill -s SIGINT -50138(注意负进程id)向整个进程组发送SIGINT。