What is the Linux equivalent to DOS pause?

LinuxBashShell

Linux Problem Overview


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?

Linux Solutions


Solution 1 - Linux

read does this:

user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$ 

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. The key 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:

read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
    echo 'A key was pressed.'
else
    echo 'No key was pressed.'
fi

Solution 2 - Linux

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

     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
    

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 $?

Solution 3 - Linux

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.

Solution 4 - Linux

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.

Solution 5 - Linux

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

Solution 6 - Linux

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.

Solution 7 - Linux

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!

Solution 8 - Linux

This fixes it so pressing any key other than ENTER will still go to a new line

read -n1 -r -s -p "Press any key to continue..." ; echo

it's better than windows pause, because you can change the text to make it more useful

read -n1 -r -s -p "Press any key to continue... (cant find the ANY key? press ENTER) " ; echo

Solution 9 - Linux

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.

Solution 10 - Linux

I've built a little program to achieve pause command in Linux. I've uploaded the code on my GitHub repo.

To install it,

git clone https://github.com/savvysiddharth/pause-command.git
cd pause-command
sudo make install

With this installed, you can now use pause command similar to like you did in windows.

It also supports optional custom string like read.

Example:

pause "Pausing execution, Human intervention required..."

Using this, C/C++ programs using statements like system("pause"); are now compatible with linux.

Solution 11 - Linux

Try this:

function pause(){
   read -p "$*"
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionjt.View Question on Stackoverflow
Solution 1 - LinuxJimView Answer on Stackoverflow
Solution 2 - Linuxy.petremannView Answer on Stackoverflow
Solution 3 - LinuxxslView Answer on Stackoverflow
Solution 4 - LinuxBuvinJView Answer on Stackoverflow
Solution 5 - LinuxmikeservView Answer on Stackoverflow
Solution 6 - LinuxmwfearnleyView Answer on Stackoverflow
Solution 7 - LinuxTom HaleView Answer on Stackoverflow
Solution 8 - LinuxSwiftNinjaProView Answer on Stackoverflow
Solution 9 - LinuxSDsolarView Answer on Stackoverflow
Solution 10 - LinuxSiddharth MauryaView Answer on Stackoverflow
Solution 11 - LinuxAlex FortView Answer on Stackoverflow