You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux Bash终端中Trap信号的相关技术咨询

Linux Bash终端中Trap信号的相关技术咨询

一、什么是捕获信号(Trap a Signal)?

简单来说,在Bash脚本里捕获信号,就是告诉系统:“当这个特定信号触发时,别执行它默认的行为,要么听我的执行指定操作,要么直接忽略它”。比如默认按下Ctrl+C会发送SIGINT(信号2)终止脚本,但如果我们捕获这个信号,就能让脚本无视这个操作,或者先执行完清理日志、关闭资源的代码再退出。

二、如何在Bash中通过名称或ID捕获信号?

Bash的trap命令就是干这个的,用法很灵活:

  • 用信号ID捕获:比如要捕获信号2(对应Ctrl+C的SIGINT),可以写 trap 'echo "别按Ctrl+C呀!"' 2
  • 用信号名称捕获:同样的信号,也可以写 trap 'echo "别按Ctrl+C呀!"' SIGINT
  • 如果要忽略某个信号,就把操作部分写成空字符串,比如 trap '' 2 或者 trap '' SIGINT

这里要提个关键知识点:信号9(SIGKILL)是系统级强制终止信号,根本无法被捕获或忽略,不管脚本里怎么写,收到这个信号进程都会直接被干掉。

三、修改你的脚本以捕获指定信号(比如9、20等)

结合你的需求,先修正脚本里无效的信号9,再调整捕获逻辑,给你加了注释方便理解:

#!/bin/bash

# 注意:信号9(SIGKILL)无法被捕获/忽略,所以这里不写它
# 下面命令表示忽略这些信号:
# 2(SIGINT/Ctrl+C)、3(SIGQUIT/Ctrl+\)、18(SIGCONT/恢复挂起进程)、20(SIGTSTP/Ctrl+Z)
trap '' 2 3 18 20

# 关闭终端回显(输入内容不会显示在屏幕上,适合输入密钥场景)
stty -echo

# 第一次输入密钥
read -p "Key: " key_1
echo

# 第二次输入密钥确认
read -p "Again: " key_2
echo

key_3=

# 校验两次输入是否一致
if [ "$key_1" = "$key_2" ]; then
    # 清屏
    tput clear
    # 循环等待输入正确密钥才允许退出
    until [ "$key_3" = "$key_2" ]; do
        read key_3
    done
else
    # 将错误信息输出到标准错误流
    echo "locktty: keys do not match" 1>&2
fi

# 恢复终端回显
stty echo

如果你的需求不是忽略信号,而是捕获后执行自定义操作(比如收到信号20时给用户提示),可以把trap行改成这样:

# 捕获信号20(SIGTSTP),触发自定义提示
trap 'echo "抱歉,这个脚本不能被挂起!"' 20

备注:内容来源于stack exchange,提问作者Humza Config

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 12:03:08