323

I'm making a script to install my theme, after it finished installing it will appear the changelog and there will be "Press any key to continue" so that after users read the changelog then press any key to continue

9
  • 16
    use less to display your changelog
    – cas
    Jul 5, 2016 at 7:21
  • 45
    Ugh - don't do that! Installers should not be interactive; nobody wants to sit babysitting when they could have a bunch of stuff queued up to install. Just drop the changelog in your platform's standard location (usually /usr/share/doc/<package>/Changelog) and let them be done with it. For those who want to read every change, they can just install apt-showchanges or equivalent... Jul 5, 2016 at 15:59
  • Well in my country people do differently, so i just make theme installer as simple as possible: choose option to install>let script do it all>after finished installing show the changelog>press any key to exit, it just a script to install my iOS 10 theme on iPhone 3GS by replacing system. I double check the code so that it wont mess up the system, I tried a few install attempt and it works flawlessly Jul 5, 2016 at 16:09
  • 21
    but... where's the "any" key? ;) Jul 6, 2016 at 12:39
  • 7
    if i could edit my comment this late I'd say 'use less to display your changelog, but "Ugh - don't do that! ..."'
    – cas
    Jul 6, 2016 at 17:18

3 Answers 3

519

You can use the read command. If you are using bash:

read -p "Press enter to continue"

In other shells, you can do:

printf "%s " "Press enter to continue"
read ans

As mentioned in the comments above, this command does actually require the user to press enter; a solution that works with any key in bash would be:

read -n 1 -s -r -p "Press any key to continue"

Explanation by Rayne and wchargin

-n defines the required character count to stop reading

-s hides the user's input

-r causes the string to be interpreted "raw" (without considering backslash escapes)

5
  • Then what after the read statement? Seems to be missing the following line.
    – Jortstek
    May 2, 2020 at 9:05
  • 1
    this helped me when I ran into the "no coprocess" error in zsh unix.stackexchange.com/questions/198372/…
    – LexJacobs
    Jul 29, 2020 at 21:59
  • If you got here because somebody integrated this into their code (for example abook --add-email-quiet), and you need a workaround, pipe yes | thecommand. May 16, 2021 at 11:42
  • 1
    Yes, but I would add (like suggested by @EKons) to incl. ";echo" at the end, as it is more elegant, it brings the terminal back to a fresh new line. just my 2 cents
    – avia
    Jul 11, 2021 at 8:31
  • it's showing % when pressing key. Jan 20 at 12:36
23
read -rsn1 -p"Press any key to continue";echo

Or, if you actually need the REPLY variable:

read -rsn1 -p"Press any key to continue" variable;echo

Replace variable with a variable name you don't need.

2
  • 9
    echo; read -rsn1 -p "Press any key to continue . . ."; echo Oh my gosh... I've done it! I've made Windose!
    – Andrew
    Mar 20, 2019 at 3:15
  • 3
    This solution (incl. ;echo) is more elegant since it brings the terminal back to a fresh new line. just my 2 cents
    – avia
    Jul 11, 2021 at 8:31
20

As @cas wrote in a comment, you really should use less for this. If the changelog is more than one page, you really want a pager anyway.

You normally want to consult the PAGER environment variable instead of just calling less:

${PAGER:-less} changelog

will use $PAGER if it is set and less otherwise.

1
  • Thank you my changelog is not that long, its less than half of iPhone screen (I'm doing script on iPhone) Jul 5, 2016 at 9:59

Not the answer you're looking for? Browse other questions tagged .