I have a Bash shell script in which I would like to pause execution until the user presses a key. In DOS, this is easily accomplished with the "pause" command. Is there a Linux equivalent I can use in my script?
相关问题
- How to get the return code of a shell script in lu
- Is shmid returned by shmget() unique across proces
- how to get running process information in java?
- JQ: Select when attribute value exists in a bash a
- Invoking Mirth Connect CLI with Powershell script
read
without any parameters will only continue if you press enter. The DOSpause
command will continue if you press any key. Useread –n1
if you want this behaviour.read
does this:The
-n1
specifies that it only waits for a single character. The-r
puts it into raw mode, which is necessary because otherwise, if you press something like backslash, it doesn't register until you hit the next key. The-p
specifies the prompt, which must be quoted if it contains spaces. Thekey
argument is only necessary if you want to know which key they pressed, in which case you can access it through$key
.If you are using Bash, you can also specify a timeout with
-t
, which causes read to return a failure when a key isn't pressed. So for example:This function works in both
bash
andzsh
, and ensures I/O to the terminal:Put it in your
.{ba,z}shrc
for Great Justice!I use these ways a lot that are very short, and they are like @theunamedguy and @Jim solutions, but with timeout and silent mode in addition.
I especially love the last case and use it in a lot of scripts that run in a loop until the user presses Enter.
Commands
Enter solution
Escape solution (with -d $'\e')
Any key solution (with -n 1)
Question with preselected choice (with -ei $'Y')
Timeout solution (with -t 5)
Sleep enhanced alias
Explanation
-r specifies raw mode, which don't allow combined characters like "\" or "^".
-s specifies silent mode, and because we don't need keyboard output.
-p $'prompt' specifies the prompt, which need to be between $' and ' to let spaces and escaped characters. Be careful, you must put between single quotes with dollars symbol to benefit escaped characters, otherwise you can use simple quotes.
-d $'\e' specifies escappe as delimiter charater, so as a final character for current entry, this is possible to put any character but be careful to put a character that the user can type.
-n 1 specifies that it only needs a single character.
-e specifies readline mode.
-i $'Y' specifies Y as initial text in readline mode.
-t 5 specifies a timeout of 5 seconds
key serve in case you need to know the input, in -n1 case, the key that has been pressed.
$? serve to know the exit code of the last program, for read, 142 in case of timeout, 0 correct input. Put $? in a variable as soon as possible if you need to test it after somes commands, because all commands would rewrite $?
This worked for me on multiple flavors of Linux, where some of these other solutions did not (including the most popular ones here). I think it's more readable too...
Note that a variable needs to be supplied as an argument to
read
.read -n1
is not portable. A portable way to do the same might be:Besides using
read
, for just a pressENTER
to continue prompt you could do: