如何解决陷阱 "stty echo" INT 与 read -s 一起使用时无效
给定这个 bash 脚本:
stty -echo
echo $(stty)
reset() {
stty echo
echo $(stty)
exit
}
trap reset int
read -s
sleep 10
我希望启用 echo 选项,但是在按下 ctrlc 后,它仍然被禁用,即使我已经运行了 stty echo
(你可以请参见 reset
函数的输出)。
解决方法
正如评论中的@KamilCuk has noticed,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 也noted 那个
使用 old=$(stty -g)
捕获当前终端设置,然后使用 stty "$old"
恢复这些设置会很有用。
使用它可以让您在调用 stty -g
时恢复确切的终端设置。这比使用 stty -echo
等撤消更改更可靠。
我认为这是更合适的解决方案,因为默认情况下 stty
可能会以无回声模式运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。