Search code examples
bashiotimeout

How to use Bash read with a timeout?


I can ask the user to press Enter by using read, and have him wait by calling sleep. But I can’t think of a way of doing both at the same time. I would like the user to be given the choice:

Press Ctrl+C to Cancel, Enter to continue or just wait 10 seconds

How can I do that?


Solution

  • In bash(1), the read command has a -t option where you can specify a timeout. From the man page:

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

    -t timeout: cause read to time out and return failure if a complete line of input is not read within timeout seconds. This option has no effect if read is not reading input from the terminal or a pipe.

    Transcript below (without hitting 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
    

    Another, hitting ENTER after a couple of seconds:

    $ 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
    

    And a final one, hitting 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) If you're doing this in a script, make sure that it's running under bash rather than some other shell.

    You can do that in many ways such as by using a #! shebang line of some type, specifying the shell when you run the command, or making sure your system will run bash by default for scripts.