What is the Linux equivalent to DOS pause?

前端 未结 9 435
猫巷女王i
猫巷女王i 2020-11-30 16:15

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

相关标签:
9条回答
  • 2020-11-30 16:48

    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.

    0 讨论(0)
  • 2020-11-30 16:48

    Try this:

    function pause(){
       read -p "$*"
    }
    
    0 讨论(0)
  • 2020-11-30 16:49

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

    0 讨论(0)
  • 2020-11-30 16:52

    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!

    0 讨论(0)
  • 2020-11-30 16:55

    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
    
    0 讨论(0)
  • 2020-11-30 16:59

    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.

    0 讨论(0)
提交回复
热议问题