在 ZSH 中使用陷阱退出 shell 脚本的正确方法?

2023-12-23

我无法在不退出 shell 的情况下使 Zshell 脚本中的陷阱函数正常工作。我有一个简单的倒数计时器,我希望能够使用 ^C 中断它,当我这样做时,我希望陷阱更改终端中的光标状态。

我的语法是:

#!/bin/zsh

trap 'tput cnorm; exit' INT TERM

我也尝试过:

trap 'tput cnorm; kill -9 $$' INT TERM

两个中断都完全退出 shell。如何仅退出脚本并返回命令行?

任何指导将不胜感激!


使用陷阱处理信号

TRAPINT() {
    echo "TRAPINT() called: ^C was pressed"
}

TRAPQUIT() {
    echo "TRAPQUIT() called: ^\\ was pressed"
}

TRAPTERM() {
    echo "TRAPTERM() called: a 'kill' command was aimed at this program's process ID"
}

TRAPEXIT() {
    echo "TRAPEXIT() called: happens at the end of the script no matter what"
}

for i in {1..9}; do
    echo ${i}
    sleep 1
done

对于所有这些TRAP[NAL]()最终命令的功能是return 0(或者如果根本没有 return 语句,那么代码执行将从程序停止的地方继续执行,就好像信号被接受、捕获和处理一样。如果该函数的返回状态非零,则返回状态trap的内容会被保留,之前执行的命令会被中断,你可以这样做return $((128+$1))返回与信号未被捕获相同的状态

至于为什么你的 shell 被杀死,是因为调用kill -9 $$将发送信号 9 到与您的 shell 关联的进程 ID。信号 #9,或SIGKILL是无法用陷阱处理的一种信号。如果程序确实需要立即停止且不允许进行清理,那么这就是“最后手段的杀戮”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ZSH 中使用陷阱退出 shell 脚本的正确方法? 的相关文章

随机推荐