我在服务器上有一个(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命令暂停屏幕以检查是否不活动,但是还没有找到使命令工作的方法。
答案 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)
我正在寻找一种简单的解决方案,该解决方案可以执行以下操作:
这可以分两行实现,如下所示:
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
注意事项:输入第一个字符后将无法对其进行编辑,而其他所有字符都可以进行编辑(退格和重新键入)。有任何简单解决方案的想法吗?