나는 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 '
...
')