![계속하려면 Enter 키를 누르세요.](https://linux55.com/image/175456/%EA%B3%84%EC%86%8D%ED%95%98%EB%A0%A4%EB%A9%B4%20Enter%20%ED%82%A4%EB%A5%BC%20%EB%88%84%EB%A5%B4%EC%84%B8%EC%9A%94..png)
Enter사용자가 명령을 사용하지 않고 키를 누를 때까지 스크립트를 중지할 수 있는 방법이 있는지 궁금합니다 . read
옵션만 전달하면 됩니다 stty
.
이에 대한 코드가 궁금해서 검색을 좀 해보니 계속하려면 "공백"이 필요한 코드를 찾았고 hold
변수를 빈 공간에서 로 변경했지만 \n
성공하지 못했습니다.
다음과 같습니다.
function _enter-to-continue() {
local hold='\n' # this solution i tried, but without success
printf "Press 'ENTER' to continue or 'ESC' to cancel... "
local original_tty_state=$(stty -g)
trap "stty $original_tty_state; exit 0" 2
stty intr \033
stty raw isig noflsh echo icrnl
until [ -z "${hold#$in}" ]; do
in=$(dd bs=1 count=1 </dev/tty 2>/dev/null)
done
stty "$original_tty_state"
}
답변1
나는 질문을 충분히 철저하게 읽지 않았다는 것을 인정해야 합니다. 한 가지 이유는 귀하의 의도가 터미널 설정과 전혀 관련이 없지만 icrnl
어쨌든 기본값이기 때문입니다.
[ -z "${hold#$in}" ]
[ "$in" = ' ' ]
or 을 말하는 다소 이상한 방법입니다 [ "$hold" = "$in" ]
. 문제 또는 코드가 $(cmd)
후행 줄 바꿈을 제거하고 있습니다. 여러분이 기다리고 있는 것은 개행 문자뿐입니다. 따라서 원하는 문자는 테스트 코드에 도달하지 않습니다. 당신은해야합니다
in=$(dd bs=1 count=1 </dev/tty 2>/dev/null; echo x)
in="${in%x}"
또 다른 질문은 입니다 local hold='\n'
. 그것은 작동하지 않습니다. C가 아닙니다. 당신은해야합니다
hold='
'
# or
hold=$'\n'
Enter아무것도 기다리지 마세요read
head -n 1 >/dev/null
이는 전체 until
루프를 대체하지만 개행에서만 가능합니다.