BASH:输入时按Ctrl + C打破当前终端

Mad*_*rin 2 linux bash shell terminal

我的Bash版本是:GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu).

我有一段这样的代码:

   while true; do
        echo -n "Set password: "
        read -s pass1
        printf "\n"
        echo -n "Repeat password: "
        read -s pass2
        printf "\n"
        if [ $pass1 != $pass2 ]; then
            echo "Not same."
        else
            break
        fi
    done
Run Code Online (Sandbox Code Playgroud)

如果我退出此脚本ctrl+c同时在线上阅读pass2我的终端停止正常工作.

user@host:~/bin$ user@host:~/bin$ user@host:~/bin$ user@host:~/bin$No command 'aaaa' found, did you mean...
Run Code Online (Sandbox Code Playgroud)

一切都写到同一行,我的打字没有回应.我使用Putty进行这些连接.当我再次连接到主机时,每个人都在重新工作.

仅当某些条件为真时才会出现此问题:仅在运行时才出现此问题sudo.普通用户和root(成为root用户sudo -s)都可以毫无问题地退出脚本.

此问题仅在第二个读取语句中存在.读取pass1变量时退出不会造成任何麻烦.

这个问题可能是什么原因?

che*_*ner 5

重置您的终端应该有所帮助.read -s正在更改某些设置以隐藏输入,在某些情况下,这些设置在收到中断信号后不会恢复.将此行添加到脚本的开头,以确保您的脚本将终端重置为良好状态:

trap 'stty sane' INT
Run Code Online (Sandbox Code Playgroud)

正如User112638726所指出的,您应该在脚本开头保存终端的状态,然后恢复(而不是假设原始状态与sane产生的状态相同).

original_tty_state=$(stty -g)
trap "stty $original_tty_state" INT
Run Code Online (Sandbox Code Playgroud)

  • 你应该在脚本开头保存你的stty选项并恢复它们而不是使用sane. (3认同)