How do I read any one key in Bash?
Solution 1
You are better off using dialog as jm666 mentioned, but there are other ways to skin that cat.
read -n 1 x; while read -n 1 -t .1 y; do x="$x$y"; done
Basically wait until you read a character and then spin consuming input until .1 seconds has passed w/o input.
Warning, fast typists could get annoyed. You might need to tweak that timeout.
Solution 2
Not a direct answer to your question - but the way of solution:
You probably should check the "dialog" utility for creating "ncurses" (screen oriented) dialog boxes from the shell. see: http://hightek.org/dialog/
Google form some examples, or check: http://unstableme.blogspot.sk/2009/12/linux-dialog-utility-short-tutorial.html
biggles5107
Updated on June 11, 2022Comments
-
biggles5107 over 1 year
I can get
read -n 1 KEY
to get most keys, except for keys which are represented by multiple characters. For example, if I press the up arrow key:$ read -n 1; echo ^[[A $ [A
As you can see,
read
only takes the Esc and the[A
is left over.What I want to be able to do in a script is:
- Go through a list with the arrow keys and press Enter to do something with it
- For other actions, press different keys.
-
Seth Robertson over 11 years@bi99l35: I guess 2400 baud dialup connections are pretty rare, so that should be safe.
-
Alfe over 10 yearsStill not good when you copy&paste some text. Then no timeout is fast enough to detect this. We should use the terminfo to find out whether we have a multibyte keypress at hand.
-
dylnmc about 9 yearsThis doesn't work for me (linux) when the character is Enter or Space or Tab. It does work for Backspace and even Esc, though.