Le_*_*een 4 shell scripting command-line zsh
我无法在不退出 shell 的情况下让 Zshell 脚本中的陷阱函数工作。我有一个简单的倒数计时器,我希望能够使用 ^C 中断它,当我这样做时,我希望陷阱更改终端中的光标状态。
我的语法是:
#!/bin/zsh
trap 'tput cnorm; exit' INT TERM
Run Code Online (Sandbox Code Playgroud)
我也试过:
trap 'tput cnorm; kill -9 $$' INT TERM
Run Code Online (Sandbox Code Playgroud)
两个中断都完全退出 shell。如何只退出脚本并返回命令行?
任何指导将不胜感激!
小智 5
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
Run Code Online (Sandbox Code Playgroud)
对于所有这些TRAP[NAL]()函数,如果最终命令是return 0(或者根本没有 return 语句,那么代码将在程序停止的地方继续执行,就好像信号被接受、捕获和处理一样。如果返回状态为此函数非零,则陷阱的返回状态被保留,之前发生的命令执行将被中断。你可以return $((128+$1))像信号没有被陷阱一样返回相同的状态
至于为什么您的 shell 被杀死,这是因为调用kill -9 $$会将信号 9 发送到与您的 shell 关联的进程 ID。信号#9,或者SIGKILL是不能用陷阱处理的信号。如果程序真的需要立即停止,并且不允许进行清理,那么这有点像“最后的杀戮”。