如何使用Bash读取超时?

时间:2012-02-28 14:22:15

标签: bash io timeout

我可以要求用户使用read Enter ,让他等一下,致电sleep。但我想不出同时做两件事的方法。我希望用户可以选择:

Ctrl + C 取消,输入继续或等待10秒

我该怎么做?

4 个答案:

答案 0 :(得分:114)

bash中,read有一个-t选项,您可以在其中指定超时。从联机帮助页:

  

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

     

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

下面的成绩单(没有点击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 :(得分:15)

read内置版已超时。

read -t 10

会这样做

答案 2 :(得分:1)

来自bash reference manual

  

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

答案 3 :(得分:1)

基于上述深思熟虑的答案,读取的返回值有助于区分来自用户的空响应(例如“按 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