シェルを終了せずに動作するように、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
が、最初に変更するために何もしなかったので、実際には必要ありませんが、上記の質問であなたが言ったものとより密接に一致するように含めました。
これはあなたが試しているものに近いですか?