【问题标题】:BASH: Ctrl+C during input breaks current terminalBASH:输入期间的 Ctrl+C 会中断当前终端
【发布时间】:2015-08-04 12:04:04
【问题描述】:

我的 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 变量时退出不会有任何问题。

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

【问题讨论】:

  • 这可能与修改当前终端设置的-s 选项有关。尝试在 while 循环之前添加trap 'stty sane' INT,以便在您键入 Ctrl-C 后,shell 将在实际退出之前尝试修复您的终端。
  • 这似乎有效。我现在可以退出脚本,即使是 sudo 也没有问题。
  • 您可能也对this answer 感兴趣,以解决我遇到的类似问题。

标签: linux bash shell terminal


【解决方案1】:

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

trap 'stty sane' INT

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

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

【讨论】:

  • 你真的应该在脚本开始时保存你的 stty 选项并恢复它们,而不是使用 sane。
  • 你可以内联变量:trap "stty $(stty -g)" INT.
猜你喜欢
  • 1970-01-01
  • 2013-02-12
  • 2015-08-06
  • 2020-05-02
  • 2017-06-20
  • 2022-01-20
  • 2021-03-27
  • 1970-01-01
  • 2023-04-11
相关资源
最近更新 更多