1

鉴于此 bash 脚本:

stty -echo
echo $(stty)

reset() {
        stty echo
        echo $(stty)
        exit
}

trap reset int
read -s
sleep 10

我希望启用 echo 选项,但按下后ctrlc它仍然被禁用,即使我已经运行stty echo (正如您在reset函数的输出中看到的那样)。

终端图片

4

1 回答 1

0

正如@KamilCuk在评论中注意到read的那样,保存配置并在进程存在时恢复它。这导致在运行时所做的修改read被丢弃。解决方案是在运行之前恢复默认值,并在完成read后重做它们。read

stty -echo
echo $(stty)

reset() {
        stty echo
        echo $(stty)
        exit
}

trap reset int

stty echo # This line has been added
read -s
echo read finished
stty -echo # This line has been added

sleep 10

@JonathanLeffler还指出

它可用于old=$(stty -g)捕获当前终端设置,然后用于stty "$old"恢复这些设置。

说明

stty -g使用它可以让您在调用时恢复准确的终端设置。这比使用stty -echoetc撤消更改更可靠。

我认为这是更合适的解决方案,因为stty默认情况下可能以无回声模式运行。

于 2021-04-30T20:34:48.097 回答