BASH:input中断当前terminal的Ctrl + C

我的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退出这个脚本,我的terminal就不能正常工作了。

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

一切都写到同一行,我的打字没有回应。 我使用腻子进行这些连接。 当我再次连接到主机everyting正在重新工作。

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

此问题仅在第二个读取语句中存在。 读取pass1variables时退出pass1导致麻烦。

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

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

 trap 'stty sane' INT 

正如User112638726所指出的那样,您应该将脚本的状态保存在脚本的开始部分,然后恢复(而不是假设原始状态与理解产生的相同)。

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