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

时间:2015-08-04 12:04:04

标签: 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

如果我在阅读ctrl+c行时pass2退出此脚本,我的终端将无法正常工作。

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变量时退出不会造成任何麻烦。

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

1 个答案:

答案 0 :(得分:5)

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

trap 'stty sane' INT

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

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