BASH: Ctrl+C 输入时中断当前终端

BASH: Ctrl+C during input breaks current 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

如果我在读取 pass2 行时使用 ctrl+c 退出此脚本,我的终端将停止正常工作。

user@host:~/bin$ user@host:~/bin$ user@host:~/bin$ user@host:~/bin$No command 'aaaa' found, did you mean...

所有内容都写入同一行,我的输入没有回显。我使用 Putty 进行这些连接。当我再次连接到主机时,一切都恢复正常了。

只有在满足某些条件时才会出现此问题: 只有 运行 和 sudo。普通用户和 root(通过 sudo -s 成为 root)都可以毫无问题地退出脚本。

此问题仅在第二次读取语句时存在。读取 pass1 变量时退出不会造成任何问题。

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

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

trap 'stty sane' INT

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

original_tty_state=$(stty -g)
trap "stty $original_tty_state" INT