我想在bash会话中按任何键时重置一个计时器。我希望这不要打断你在会话中尝试做的任何事情,而只是在每次按键时重置计时器。我发现的所有事情都会打断你正在做的事情。谢谢你的建议。任何问题只是问及耐心我不幸的是,页面可能有点慢。
答案 0 :(得分:0)
真的没有任何好的"或者"惯用的"这样做的方式,除非我忘了什么。但是有两种方法可以排序"排序"做到这一点:
使用while
循环和read
超时。请注意,这使用了一些bash
特定的扩展,并且不能移植到其他shell。它也可能不符合您的代码逻辑。例如:
#!/bin/bash
timer=0
while :; do
# Read one key with a timeout of 1 second
read -s -t1 -n1 key
[ "$key" = "a" ] && timer=0
# Do some work here
echo "key: $key, timer: $timer"
timer=$(( $timer + 1))
done
另一个缺点是read
等待1秒。
另一种选择是滥用信号。当您按下键盘上的某些键时,会向该过程发送一个信号; ^ C发送SIGINT
,^ Z发送SIGSTP
等。您可以捕获或“捕获”#34;其中一些信号带有trap
命令并运行命令。它有点像现代编程语言中的异常。
您还可以使用kill(1)
发送信号。另见signal(7)
。并非所有信号都可以捕获(有些信号被终端捕获,例如^ S和^ Q,尽管你可以禁用它)。
#!/bin/bash
timer=0
signal() {
echo $timer
# Allow quiting by pressing ^C twice in a row
[ $timer -lt 2 ] && exit
timer=0
}
# See trap -l for a full list.
trap signal SIGINT
while :; do
echo "timer: $timer"
timer=$(( $timer + 1))
sleep 1
done
这没有延迟,适用于所有炮弹。但是它有明显的缺点,它仅限于几个控制映射。它也是一种滥用信号功能的东西。
如果你想做更多的事情,你应该考虑迁移到真实的"编程语言。