如果用“ctrl-c”杀死,为什么“read -s”的行为与“read”不同?

如果用“ctrl-c”杀死,为什么“read -s”的行为与“read”不同?

考虑这个脚本:

#!/bin/bash

echo "hi there $(whoami)"

[ "`whoami`" = "root" ] || {
  exec sudo -u root "$0" "$@"
  echo "this is never called"
}

read -s -p "enter stuff: " stuff
echo "answer: $stuff"

如果我以用户身份运行它lars并输入woohoo,那么我会得到以下输出:

hi there lars
hi there root
enter stuff:
answer: woohoo

但是,如果我ctrl-c在脚本等待我的read输入时,我就会进入一种奇怪的状态。控制台似乎陷入静音模式。如果我省略-s(=静默模式)选项,则不会出现该问题。

您知道这里的确切问题是什么吗?如果有人ctrl-c在输入过程中按下,我怎样才能使脚本正常运行。

我正在运行 bash 4.3.30。

答案1

显然这是一个Bash 4.3 中的错误已在 Bash 4.4 中修复:

哦。修复了一个错误,如果在 readline() 调用(包括“read -e”和“read -s”)中收到致命信号,则导致 bash 无法清理 readline 的状态(包括终端设置)。

我使用恢复终端设置的陷阱解决了这个问题:

    [ "`whoami`" = "root" ] || {
      exec sudo -u root "$0" "$@"
    }

    function finish {
      stty echo echok
    }
    trap finish EXIT
    read -s -p "enter stuff: " stuff
    echo "answer: $stuff"

相关内容