Linux 读取 - x 秒后超时 *空闲*



我在服务器上有一个(bash(脚本,我继承了它的管理方面,并且最近发现了脚本中的一个缺陷,没有人引起我的注意。

发现问题后,其他人告诉我这一直激怒他们,但从未告诉我(太好了......

所以,剧本遵循这个概念

#!/bin/bash
function refreshscreen(){
# This function refreshes a "statistics screen"
...
echo "Enter command to override update"
read -t 10 variable
}

此脚本刷新统计信息屏幕,并允许用户停止更新以代替内置于case语句中的命令。但是,读取超时 (read -t 10( 在 10 秒后,无论用户是否在键入。

长话短说,如果用户主动键入命令,有没有办法防止读取超时?最好的情况是"SEC 空闲/非活动秒数超时",而不是在 x 秒后超时。

我曾考虑过在读取命令暂停屏幕以检查不活动之前在循环结束时运行后台脚本,但尚未找到使该命令工作的方法。

您可以在循环中使用read,一次读取一个字符,然后将其添加到最终读取字符串中。然后,这将为每个字符而不是每个命令为用户提供一些超时时间。下面是一个示例函数,您可以将其合并到脚本中,以显示我在说什么:

read_with_idle_timeout() {
local input=""
read -t 10 -N 1 variable
while [ ! -z $variable ]
do
input+=$variable
read -t 10 -N 1 variable
done
echo "Read: $input"
}

这将给用户 10 秒的时间来键入每个字符。如果他们停止键入,您将获得与超时发生之前开始键入的命令一样多的命令,然后您的case语句可以处理它。也许您可以将最终字符串存储在全局变量中,或者只是将此代码直接放入其他函数中。

如果您需要多个单词,因为read$IFS中断,您可以多次调用此函数,直到获得所需的所有输入。

我已经搜索了一个简单的解决方案,可以执行以下操作:

  • 10 秒后超时(如果根本没有用户输入(
  • 如果在前 10 秒内键入第一个字符,则用户有无限的时间来完成他的答案。

这可以通过以下两行实现:

read -N 1 -t 10 -p "What is your name? > " a
[ "$a" != "" ] && read b && echo "Your name is $a$b" || echo "(timeout)"

如果用户在输入第一个字符之前等待 10 秒,则输出将为:

What is your name? > (timeout)

如果用户在 10 秒内键入第一个字符,则他有无限的时间来完成此任务。输出将如下所示:

What is your name? > Oliver
Your name is Oliver

警告:第一个字符一旦键入就不可编辑,而所有其他字符都可以编辑(退格和重新键入(。对简单的解决方案有什么想法吗?

相关内容

  • 没有找到相关文章

最新更新