我正在处理的脚本在静默模式下读取单个字符,并将其存储到$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上
有什么想法吗?
非常感谢您的帮助!
发布于 2015-02-11 22:08:52
尝试在exit函数中重新启用tty回显:
#!/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
为您的系统检查这一点
在调用脚本之前运行它,然后在脚本完成后再次运行它,并检查输出中的差异,以确定程序更改了什么。然后将更改后的标志重新设置。
$ 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
发布于 2014-03-27 20:45:20
我想你可以使用DD,尽管我不明白你到底想要改变什么。
c=$(stty raw;dd bs=1 count=1 if=$(tty) status=none;stty sane)
它至少会在你输入一个字节时停止读取( stdin
)。只需键入一个键,即可设置$c
。
https://stackoverflow.com/questions/22679685
复制相似问题