Try this:
function pause(){
read -p "$*"
}
Yes to using read
- and there are a couple of tweaks that make it most useful in both cron
and in the terminal.
Example:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
The -n 120 makes the read statement time out after 2 minutes so it does not block in cron
.
In terminal it gives 2 minutes to see how long the rsync
command took to execute.
Then the subsequent echo
is so the subsequent bash prompt will appear on the next line.
Otherwise it will show on the same line directly after "continue..." when Enter is pressed in terminal.
If you just need to pause a loop or script, and you're happy to press Enter instead of any key, then read
on its own will do the job.
do_stuff
read
do_more_stuff
It's not end-user friendly, but may be enough in cases where you're writing a quick script for yourself, and you need to pause it to do something manually in the background.
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.
Enter solution
read -rsp $'Press enter to continue...\n'
Escape solution (with -d $'\e')
read -rsp $'Press escape to continue...\n' -d $'\e'
Any key solution (with -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
Question with preselected choice (with -ei $'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
Timeout solution (with -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
Sleep enhanced alias
read -rst 0.5; timeout=$?
# echo $timeout
-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 $?
read
without any parameters will only continue if you press enter.
The DOS pause
command will continue if you press any key. Use read –n1
if you want this behaviour.
read -n1
is not portable. A portable way to do the same might be:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
Besides using read
, for just a press ENTER
to continue prompt you could do:
sed -n q </dev/tty
This function works in both bash
and zsh
, and ensures I/O to the terminal:
# Prompt for a keypress to continue. Customise prompt with $*
function pause {
>/dev/tty printf '%s' "${*:-Press any key to continue... }"
[[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN
[[ $BASH_VERSION ]] && </dev/tty read -rsn1
printf '\n'
}
export_function pause
Put it in your .{ba,z}shrc
for Great Justice!
read
without any parameters will only continue if you press enter.
The DOS pause
command will continue if you press any key. Use read –n1
if you want this behaviour.
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...
echo Press enter to continue; read dummy;
Note that a variable needs to be supplied as an argument to read
.
Try this:
function pause(){
read -p "$*"
}
If you just need to pause a loop or script, and you're happy to press Enter instead of any key, then read
on its own will do the job.
do_stuff
read
do_more_stuff
It's not end-user friendly, but may be enough in cases where you're writing a quick script for yourself, and you need to pause it to do something manually in the background.
Yes to using read
- and there are a couple of tweaks that make it most useful in both cron
and in the terminal.
Example:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
The -n 120 makes the read statement time out after 2 minutes so it does not block in cron
.
In terminal it gives 2 minutes to see how long the rsync
command took to execute.
Then the subsequent echo
is so the subsequent bash prompt will appear on the next line.
Otherwise it will show on the same line directly after "continue..." when Enter is pressed in terminal.
Try this:
function pause(){
read -p "$*"
}
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.
Enter solution
read -rsp $'Press enter to continue...\n'
Escape solution (with -d $'\e')
read -rsp $'Press escape to continue...\n' -d $'\e'
Any key solution (with -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
Question with preselected choice (with -ei $'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
Timeout solution (with -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
Sleep enhanced alias
read -rst 0.5; timeout=$?
# echo $timeout
-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 function works in both bash
and zsh
, and ensures I/O to the terminal:
# Prompt for a keypress to continue. Customise prompt with $*
function pause {
>/dev/tty printf '%s' "${*:-Press any key to continue... }"
[[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN
[[ $BASH_VERSION ]] && </dev/tty read -rsn1
printf '\n'
}
export_function pause
Put it in your .{ba,z}shrc
for Great Justice!
read -n1
is not portable. A portable way to do the same might be:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
Besides using read
, for just a press ENTER
to continue prompt you could do:
sed -n q </dev/tty
read
without any parameters will only continue if you press enter.
The DOS pause
command will continue if you press any key. Use read –n1
if you want this behaviour.
Source: Stackoverflow.com