如何使用带超时的Bash-read



我可以要求用户使用readEnter,并通过调用sleep让他等待。但我想不出同时做这两件事的方法。我希望用户可以选择:

Ctrl+C取消,输入TR

我该怎么做?

bash(1)中,read命令有一个-t选项,您可以在其中指定超时。来自手册页:

read [-ers] [-u fd] [-t timeout] [-a aname] [-p prompt] [-n nchars] [-d delim] [name ...]

如果在超时秒内没有读取完整的输入行,-t timeout: 会导致read超时并返回失败。如果read没有从端子或管道读取输入,则此选项无效。

下面的成绩单(不按ENTER):

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; echo ; date
Tue Feb 28 22:29:15 WAST 2012
Hit ENTER or wait ten seconds
Tue Feb 28 22:29:25 WAST 2012

另一个,几秒钟后按ENTER键:

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; date
Tue Feb 28 22:30:17 WAST 2012
Hit ENTER or wait ten seconds
Tue Feb 28 22:30:19 WAST 2012

最后一个,击中CTRL-C:

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; echo ; date
Tue Feb 28 22:30:29 WAST 2012
Hit ENTER or wait ten seconds

(1)如果您在脚本中执行此操作,请确保它是在bash而不是其他shell下运行的。

您可以通过多种方式做到这一点,例如使用某种类型的#! shebang行,在运行命令时指定shell,或者确保您的系统在默认情况下为脚本运行bash

read内置有一个超时。

read -t 10

将执行

基于上面深思熟虑的答案,读取的返回值有助于区分用户的空响应(例如,默认操作为"按Enter")和超时。

read -t 5 -p "Prompt " RESP
if [[ $? -gt 128 ]] ; then
    echo -e "nTimeout"
else
    echo "Response = "$RESP""  # adding quotes so empty strings are obvious
fi

另一个有用的提示是-p "prompt "被写入stderr(而不是stdout),因此如果您重定向stderr,则不会显示提示。这方面的一个示例是将执行跟踪记录到日志文件中,以便稍后进行分析。要在这种情况下使用read -p Prompt,您可以将stderr重定向到只用于读取语句的用户。

set -x
exec 2>logfile
read -t 5 -p "Prompt " RESP 2>/dev/tty

来自bash参考手册:

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt][-t timeout][-u fd] [name ...]

相关内容

  • 没有找到相关文章

最新更新