如何使用Bash读取超时?


71

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

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

我怎样才能做到这一点?

Answers:


137

在中bashread有一个-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

6
当给出这样的详细答案时,我绝对喜欢它。恭喜您!
布赖恩

ubuntu。-t-非法选项
ses

@ses,请确保您使用的是内置的bash,而不是某些外部工具。
paxdiablo

如果要编写Shell脚本,请确保其以#!/bin/bash而不是开头#!/bin/sh。后者可能有效也可能无效,这取决于/bin/sh实际使用的二进制文件。你可以写#!/bin/sh,当且仅当你的脚本是POSIX兼容的,它几乎肯定是没有的。
Mikko Rantalainen '16

使用此功能时,请确保您的脚本是#!/bin/bash,而不是#!/bin/sh,因为该-t选项与POSIX不兼容(因为脚本可能无法在每台计算机上运行)
Marian


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.