鉴于此 bash 脚本:
stty -echo
echo $(stty)
reset() {
stty echo
echo $(stty)
exit
}
trap reset int
read -s
sleep 10
我希望启用 echo 选项,但按下后ctrlc它仍然被禁用,即使我已经运行stty echo (正如您在reset函数的输出中看到的那样)。
正如@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默认情况下可能以无回声模式运行。