【问题标题】:trap "stty echo" INT has no effect when used with read -s陷阱 "stty echo" INT 与 read -s 一起使用时无效
【发布时间】:2021-04-30 13:14:33
【问题描述】:

鉴于此 bash 脚本:

stty -echo
echo $(stty)

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

trap reset int
read -s
sleep 10

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

【问题讨论】:

  • 请不要图片。
  • @Roadowl 这个有什么问题?我粘贴的唯一内容是bash demo.sh,按下ctrl+c 并运行stty
  • 您可以发布运行脚本的副本,将其标记为“代码”——最好使用三反引号和“无”一词(这很难在评论中展示)。
  • bash restores tty 当 read -s 退出时。我认为链是:read -s 开始,SIGINT 陷阱执行,read -s 恢复标志,脚本终止。
  • 请注意,如果您使用read -s,则完全无需乱动终端设置。只需使用read -s——它已经可以处理无回显模式和中断。你似乎在试图解决一个不需要你解决的问题; Bash 已经处理好了。

标签: bash signals stty


【解决方案1】:

作为 cmets 中的@KamilCuk has noticedread 保存配置并在进程存在时恢复它。这会导致在 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" 恢复这些设置。

Explaination:

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

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

【讨论】:

  • 您可能会注意到我在comment 中所说的关于stty -g 的内容。使用它可以让您在调用 stty -g 时恢复准确的终端设置。这比使用stty -echo 等撤消更改更可靠。
  • @JonathanLeffler 你完全正确。已编辑:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多