bash scripting - read single keystroke including special keys enter and space
bash, keystroke, linux, shell, special-characters
Solution
Try setting the read delimiter to an empty string then check the builtin $REPLY variable:
read -d'' -s -n1
For some reason I couldn't get it to work specifying a variable.
Problem
Not sure if I should put this on stackoverflow or unix.stackexchange but I found some similar questions here, so here it goes. I'm trying to create a script to be called by .bashrc that allows me to select one of two options based on a single keystroke. That wouldn't be hard normally but I want the two keys corresponding to the two options to be space and enter. Here's what I got so far: ``` #!/bin/bash SELECT="" while [[ "$SELECT" != $'\x0a' && "$SELECT" != $'\x20' ]]; do echo "Select session type:" echo "Press <Enter> to do foo" echo "Press <Space> to do bar" read -s -N 1 SELECT echo "Debug/$SELECT/${#SELECT}" [[ "$SELECT" == $'\x0a' ]] && echo "enter" # do foo [[ "$SELECT" == $'\x20' ]] && echo "space" # do bar done ``` The following output is what I get if I press enter, space, backspace and x: ``` :~$ bin/sessionSelect.sh Select session type: Press <Enter> to start/resume a screen session Press <Space> for a regular ssh session Debug//0 Select session type: Press <Enter> to start/resume a screen session Press <Space> for a regular ssh session Debug//0 Select session type: Press <Enter> to start/resume a screen session Press <Space> for a regular ssh session Debug//1 Select session type: Press <Enter> to start/resume a screen session Press <Space> for a regular ssh session Debug/x/1 ``` So both enter and space result in an empty SELECT. No way to distinguish the two. I tried to add -d 'D' to the read options, but that didn't help. Maybe someone can point me in the right direction. The bash version would be 4.2 btw.