zshスクリプトに閉じ込める正しい方法

zshスクリプトに閉じ込める正しい方法

シェルを終了せずに動作するように、zsh シェルスクリプトからトラップ機能を取得できません。私は簡単なカウントダウンタイマーを持っていて、Ctrl+を使ってそれを止めることができるようにしたいです。Cそしてそれを行うとき、トラップは端末のカーソル状態を変更したいと思います。

私の構文は次のとおりです

trap 'tput cnorm; exit' INT TERM

私も次のことを試しました。

trap 'tput cnorm; kill -9 $$' INT TERM

どちらの割り込みもシェルを完全にシャットダウンします。どのようにスクリプトを終了してコマンドラインに戻ることができますか?

どんな案内でも大変感謝します!


実行時に対話型シェルで使用できるように自動的にロードされる関数となるシェルスクリプト。

完全なスクリプトは次のとおりです。

  #!/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、それともコマンドラインに入力しましたか?たとえば、次のことを考えてみましょう。

#!/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が、最初に変更するために何もしなかったので、実際には必要ありませんが、上記の質問であなたが言ったものとより密接に一致するように含めました。

これはあなたが試しているものに近いですか?

おすすめ記事