En ksh básicamente puedes hacer:
stty raw
REPLY=$(dd bs=1 count=1 2> /dev/null)
stty -raw
read -n1
funciona para bash
El stty raw
El modo evita que ctrl-c funcione y puede dejarlo atrapado en un bucle de entrada sin salida. También la página de manual dice stty -raw
no se garantiza que devuelva su terminal al mismo estado.
Entonces, construyendo sobre la respuesta de dtmilano usando stty -icanon -echo
evita esos problemas.
#/bin/ksh
## /bin/{ksh,sh,zsh,...}
# read_char var
read_char() {
stty -icanon -echo
eval "$1=\$(dd bs=1 count=1 2>/dev/null)"
stty icanon echo
}
read_char char
echo "got $char"
En bash, read
puede hacerlo:
read -n1 ans