在bash的时间限制内按键

时间:2016-03-09 06:06:24

标签: bash

我想在bash会话中按任何键时重置一个计时器。我希望这不要打断你在会话中尝试做的任何事情,而只是在每次按键时重置计时器。我发现的所有事情都会打断你正在做的事情。谢谢你的建议。任何问题只是问及耐心我不幸的是,页面可能有点慢。

1 个答案:

答案 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

这没有延迟,适用于所有炮弹。但是它有明显的缺点,它仅限于几个控制映射。它也是一种滥用信号功能的东西。

如果你想做更多的事情,你应该考虑迁移到真实的"编程语言。