陷入 zsh 脚本的正确方法

陷入 zsh 脚本的正确方法

我无法在不退出 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,但实际上并不需要它,因为我一开始就没有做任何更改它的操作,但我将其包含在内是为了更紧密地匹配您在上面的问题中的内容。

这与您正在尝试的接近吗?

相关内容