我无法在不退出 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(使用前将#替换为@)