다음 스크립트를 고려해보세요.
#!/bin/bash
echo "hi there $(whoami)"
[ "`whoami`" = "root" ] || {
exec sudo -u root "$0" "$@"
echo "this is never called"
}
read -s -p "enter stuff: " stuff
echo "answer: $stuff"
user로 실행 lars
하고 를 입력 하면 woohoo
다음과 같은 결과가 나타납니다.
hi there lars
hi there root
enter stuff:
answer: woohoo
그런데 스크립트가 기다리는 동안 입력을 ctrl-c
기다리면 read
이상한 상태가 됩니다. 콘솔이 자동 모드에서 멈춰 있는 것 같습니다. (=자동 모드) 옵션을 생략하면 -s
문제가 발생하지 않습니다.
여기에 정확한 문제가 무엇인지 아시나요? ctrl-c
입력 중에 누군가가 누르면 스크립트가 제대로 실행되도록 하려면 어떻게 해야 합니까?
나는 bash 4.3.30을 실행 중입니다.
답변1
분명히 이것은Bash 4.3의 버그가 Bash 4.4에서 수정되었습니다.:
오. readline() 호출("read -e" 및 "read -s" 포함) 중에 치명적인 신호가 수신된 경우 bash가 readline의 상태(터미널 설정 포함)를 정리하지 못하는 버그를 수정했습니다.
복구 터미널에서 설정한 트랩을 사용하여 이 문제를 해결했습니다.
[ "`whoami`" = "root" ] || {
exec sudo -u root "$0" "$@"
}
function finish {
stty echo echok
}
trap finish EXIT
read -s -p "enter stuff: " stuff
echo "answer: $stuff"