쉘을 종료하지 않고 작동하도록 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
처음에 변경하기 위해 아무것도 하지 않았기 때문에 실제로는 필요하지 않지만 위의 질문에서 귀하가 말한 것과 더 밀접하게 일치하기 위해 포함했습니다.
이것이 당신이 시도하는 것과 가깝습니까?