ctrl+c在linux脚本中发送sigint信号(编号2),可用trap命令自定义其处理逻辑,如执行清理操作后exit 1,而非默认终止;trap仅作用于当前shell进程。

在 Linux 脚本中,Ctrl+C 发送的是 SIGINT 信号(编号 2),默认行为是终止当前进程。要“捕捉”它,实际是用 trap 命令自定义该信号的处理逻辑,而不是阻止或屏蔽它。
用 trap 捕捉 SIGINT 并执行自定义操作
trap 是 shell 内置命令,用于指定收到特定信号时要运行的命令或函数。捕捉 Ctrl+C 的核心写法是:
- 在脚本开头或需要生效的位置写:
trap 'your_command' INT或trap your_function INT -
INT是信号名(也可写2),引号内是将要执行的 shell 代码,支持多条命令(用分号或换行分隔) - 若想退出脚本,需显式调用
exit;否则处理完后脚本会继续往下执行
常见实用写法示例
✅ 安全退出并清理临时文件:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
#!/bin/bash tmpfile="/tmp/myapp.$$" touch "$tmpfile" trap 'echo "收到 Ctrl+C,正在清理..."; rm -f "$tmpfile"; exit 1' INT while true; do echo "运行中... 按 Ctrl+C 退出" sleep 2 done
✅ 调用函数实现更清晰的逻辑:
cleanup() {
echo "执行清理:删除 $tmpfile"
rm -f "$tmpfile"
exit 1
}
trap cleanup INT
✅ 忽略 Ctrl+C(不推荐,仅作了解):trap '' INT —— 空字符串表示忽略,此时 Ctrl+C 不起作用
注意事项和易错点
-
trap只对当前 shell 进程有效,子进程(如单独执行的sleep、ping)仍按默认方式响应 SIGINT;若想让子命令也受控,需确保它们本身支持信号处理,或改用wait+ 后台任务方式 - 如果脚本正在执行阻塞操作(如
read -t 10),Ctrl+C 通常仍能中断它并触发 trap;但某些底层系统调用可能有延迟,属正常现象 - 退出状态码建议用非 0(如
exit 1),便于上层判断是被中断还是正常结束
验证是否生效的小技巧
运行脚本后,在终端按 Ctrl+C,观察是否输出你定义的提示信息,并检查临时文件是否被清理。也可用 kill -INT $! 从另一终端向脚本进程发信号测试。










