如何使用Bash读取超时?

qdi*_*dii 64 io bash timeout

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

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

我怎样才能做到这一点?

pax*_*blo 121

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
Run Code Online (Sandbox Code Playgroud)

另一个,几秒后击中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
Run Code Online (Sandbox Code Playgroud)

而另一个,击中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
Run Code Online (Sandbox Code Playgroud)

  • 当给出这样详细的答案时,我非常喜欢它.感谢你! (6认同)

Joh*_*iss 15

read内置有超时.

read -t 10
Run Code Online (Sandbox Code Playgroud)

会做的


use*_*305 6

基于上面深思熟虑的答案,读取的返回值有助于区分用户的空响应(例如默认操作的“按 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
Run Code Online (Sandbox Code Playgroud)

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

set -x
exec 2>logfile
read -t 5 -p "Prompt " RESP 2>/dev/tty
Run Code Online (Sandbox Code Playgroud)