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

时间:2017-07-23 23:45:17

标签: linux bash timeout

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

在发现问题之后,其他人告诉我它一直在刺激他们,但从未告诉过我(很棒......)

所以,脚本遵循这个概念

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

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

长话短说,如果用户正在主动输入命令,有没有办法阻止读取超时?最佳情况是"超出SEC空闲/非活动秒数"反对在x秒后暂停。

我已经考虑过在循环结束时运行后台脚本,然后read命令暂停屏幕以检查是否不活动,但是还没有找到使命令工作的方法。

2 个答案:

答案 0 :(得分:1)

您可以在循环中使用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而中断,您可以多次调用此函数,直到您获得所期望的所有输入为止。

答案 1 :(得分:0)

我正在寻找一种简单的解决方案,该解决方案可以执行以下操作:

  • 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

注意事项:输入第一个字符后将无法对其进行编辑,而其他所有字符都可以进行编辑(退格和重新键入)。有任何简单解决方案的想法吗?