鉴于此 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 -echo
etc撤消更改更可靠。
我认为这是更合适的解决方案,因为stty
默认情况下可能以无回声模式运行。