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처음에 변경하기 위해 아무것도 하지 않았기 때문에 실제로는 필요하지 않지만 위의 질문에서 귀하가 말한 것과 더 밀접하게 일치하기 위해 포함했습니다.

이것이 당신이 시도하는 것과 가깝습니까?

관련 정보