我无法在不退出 shell 的情况下使 zsh shell 脚本中的陷阱函数正常工作。我有一个简单的倒数计时器,我希望能够使用Ctrl+中断它C,当我这样做时,我希望陷阱更改终端中的光标状态。
我的语法是:
trap 'tput cnorm; exit' INT TERM
我也尝试过:
trap 'tput cnorm; kill -9 $$' INT TERM
两个中断都完全退出 shell。如何仅退出脚本并返回命令行?
任何指导将不胜感激!
它是一个 shell 脚本,在运行时将成为交互式 shell 中使用的自动加载函数。
这是整个脚本:
#!/bin/zsh
trap 'tput cnorm; exit' INT TERM
tput civis
duration=$(($1 * 60))
start=$SECONDS
time=1
while [ $time -gt 0 ]; do
output="$((duration - (SECONDS - start)))"
sleep 1
output=$(date -d@$time -u +%H:%M:%S)
echo -ne " $output \r"
done && echo -e "\033[2K"
tput cnorm
答案1
您是否trap
在 shell 脚本中包含了 ,还是在命令行中输入了它?例如,考虑:
#!/usr/bin/env zsh
interrupted=false
trap 'tput cnorm; interrupted=true' INT TERM
for ((i = 0; i < 100; ++i)); do
clear
date
sleep 1
if [[ "${interrupted}" = "true" ]]; then
echo "Interrupted"
break
fi
done
这样,我就用一个打印时间的延迟循环来模仿“倒计时”。我可以打断“倒计时”。我打印“中断”只是为了说明。
$ ./ex.zsh
Sat Jan 25 12:59:12 EST 2020
^CInterrupted
$
我的示例包括您的tput cnorm
,但实际上并不需要它,因为我一开始就没有做任何更改它的操作,但我将其包含在内是为了更紧密地匹配您在上面的问题中的内容。
这与您正在尝试的接近吗?