gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:16:58 24 4
gpt4 key购买 nike

我无法在不退出 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 语句,那么代码会从程序停止的地方继续执行,就像信号被接受、捕获和处理一样。如果这个函数的返回状态非零,那么返回状态陷阱的状态被保留,之前发生的命令执行将被中断。您可以执行 return $((128+$1)) 返回与信号未被捕获相同的状态

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

关于shell - 在 ZSH 中使用陷阱退出 shell 脚本的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59911669/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com