我的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
变量时退出不会造成任何麻烦。
这个问题可能是什么原因?
答案 0 :(得分:5)
重置您的终端应该会有所帮助。 read -s
正在更改某些设置以隐藏输入,在某些情况下,这些设置在收到中断信号后无法恢复。将此行添加到脚本的开头,以确保您的脚本将终端重置为良好状态:
trap 'stty sane' INT
正如User112638726所指出的,您应该在脚本开头保存终端的状态,然后恢复(而不是假设原始状态与sane
生成的状态相同)。
original_tty_state=$(stty -g)
trap "stty $original_tty_state" INT