加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在静默模式下读取后,在bash脚本中捕获ctrl c

发布时间:2020-12-15 22:57:37 所属栏目:安全 来源:网络整理
导读:我正在处理的脚本以静默模式读取单个字符并将其存储到$c 下面是一个测试器脚本,它做了一个例子: #!/bin/bash gracefulExit() { echo "exiting..." #other stuff would go here exit 1 } trap gracefulExit INT while [ 1 = 1 ] do read -s -r -n1 c echo "c
我正在处理的脚本以静默模式读取单个字符并将其存储到$c

下面是一个测试器脚本,它做了一个例子:

#!/bin/bash

    gracefulExit() {
          echo "exiting..."
          #other stuff would go here
          exit 1
    }

    trap gracefulExit INT

    while [ 1 = 1 ]
    do
          read -s -r -n1 c
          echo "character read"
    done

我遇到的问题是,如果你使用ctrl c打破脚本,shell将保持静默模式(我看不到任何我输入的内容),直到我退出它才会恢复正常.我注意到这只发生在我捕获ctrl c之后(没有陷阱,它从静音模式中踢出).我的脚本要求我陷阱所以我可以清理.

这是4.2.10

有任何想法吗?

非常感谢您的帮助!

解决方法

尝试重新启用exit函数中的tty echo:

#!/bin/bash

gracefulExit() {
      echo "exiting..."
      # reenable tty echo
      stty icanon echo echok
      exit 1
}

trap gracefulExit INT

while [ 1 = 1 ]
do
      read -s -r -n1 c
      echo "character read"
done

在我对OS X的测试中,读取禁用了这些设置:icanon echo echok.
您可以使用stty -a检查系统

在调用脚本之前运行它,然后在脚本完成后再次运行它并检查输出中的差异以确定您编程的更改.然后重新设置更改的标志.

$diff before.out after.out
2,3c2,3
< lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
<   -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
---
> lflags: -icanon isig iexten -echo echoe -echok echoke -echonl echoctl
>   -echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo

在这里你可以看到改变的标志:icanon,echo,echok被禁用.您可以在开头标识“ – ”.

最后这是你的脚本的另一个版本,可以自动完成全部工作:

#!/bin/bash

# save the current tty flags
tty_flags=`stty -g`

gracefulExit() {
      echo "exiting..."
      # set the saved tty flags
      stty $tty_flags
      exit 1
}

trap gracefulExit INT

while [ 1 = 1 ]
do
      read -s -r -n1 c
      echo "character read"
done

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读