首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在静默模式下读取后在bash脚本中捕获ctrl+c

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

Stack Overflow用户
提问于 2014-03-27 14:16:15
回答 2查看 1.3K关注 0票数 6

我正在处理的脚本在静默模式下读取单个字符,并将其存储到$c

下面是一个测试脚本,它与示例做同样的事情:

代码语言:javascript
代码运行次数:0
运行
复制
    #!/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上

有什么想法吗?

非常感谢您的帮助!

EN

回答 2

Stack Overflow用户

发布于 2015-02-11 22:08:52

尝试在exit函数中重新启用tty回显:

代码语言:javascript
代码运行次数:0
运行
复制
#!/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测试中,read禁用了这些设置:icanon echo echok。可以使用stty -a为您的系统检查这一点

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

代码语言:javascript
代码运行次数:0
运行
复制
$ 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被禁用。您可以将其标识为开头的"-“。

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

代码语言:javascript
代码运行次数:0
运行
复制
#!/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
票数 2
EN

Stack Overflow用户

发布于 2014-03-27 20:45:20

我想你可以使用DD,尽管我不明白你到底想要改变什么。

代码语言:javascript
代码运行次数:0
运行
复制
c=$(stty raw;dd bs=1 count=1 if=$(tty) status=none;stty sane)

它至少会在你输入一个字节时停止读取( stdin )。只需键入一个键,即可设置$c

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22679685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档