Zsh: Vared 내장 시간 초과

Zsh: Vared 내장 시간 초과

나는 while 루프를 사용하고 있습니다.vared사용자에게 입력하라는 메시지를 표시합니다. 시간 초과를 설정하고 기본 변수를 실행하고 일정 시간이 지난 후에도 사용자 입력이 없으면 프롬프트로 다시 돌아가는 방법을 찾고 있습니다. 읽기 명령과 해당 시간 초과 매개 변수에 대해 알고 있지만 이것이 통과 가능합니까 vared?

vared또한 프롬프트에 인쇄되지 않도록 기본값을 설정하는 방법이 있습니까 ?

local command

while :

   do
     echo "Enter a command or type 'quit' to exit:"
     vared -p "[*]: " command

     if [ "$command" = "quit" ]; then
         break

     else
         run command
     fi

     clear

   done

답변1

다음을 수행할 수 있습니다.

default=foobar
if
  command=$(
    saved_settings=$(stty -g)
    trap 'stty $saved_settings; exit 1' ALRM
    v=
    TMOUT=10 vared -p "Enter a command [$default]: " v &&
      printf %s $v
  )
then
  command=${command:-$default}
  printf 'Got: "%s"\n' $command
else
  print timeout
fi

바꾸다시작하다기본값이 있는 변수는 빈 문자열로 채우고 vared반환 후에도 변수가 여전히 비어 있는 경우에만 기본값으로 설정합니다.

시간 초과를 처리하기 위해 $TMOUT서브쉘에서 특수 변수를 사용합니다. 이 변수는 zle서브쉘이 몇 초 후에 종료되도록 합니다 $TMOUT.

이는 10초의 전역 시간 초과입니다. 또 다른 접근 방식 은 사용자에게 큰 명령을 입력할 수 있는 충분한 시간을 제공하지만 3초 동안 활동이 없으면 시간 초과되는 터미널 줄 규칙 문자 간 시간 초과( stty time x, 10분의 1로 표시) 를 사용하는 것입니다 .x

default=foobar
if
  command=$(
    saved_settings=$(stty -g)
    trap 'stty $saved_settings' EXIT INT TERM ALRM
    zle-line-init() stty -icanon time 30 min 0 <&2
    zle -N zle-line-init
    v=
    vared -p "Enter a command [$default]: " v &&
      printf %s $v
  )
then
  command=${command:-$default}
  printf 'Got: "%s"\n' $command
else
  print
  print timeout
fi

이러한 작업은 스크립트에서 작동하지만현재 대화형 셸에서는 작동하지 않습니다.vared서브쉘에서의 실행은 거부되기 때문입니다 . 에서 문제가 해결될 때까지 대화형 셸에서 실행해야 하는 경우 zsh다음을 변경할 수 있습니다.

command=$(
  ...
)

도착하다

command=$(default=$default zsh -c '
  ...
')

관련 정보