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
我的 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