"ctrl-c"로 종료하면 "read -s"가 "read"와 다르게 동작하는 이유는 무엇입니까?

"ctrl-c"로 종료하면 "read -s"가 "read"와 다르게 동작하는 이유는 무엇입니까?

다음 스크립트를 고려해보세요.

#!/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"

관련 정보