¿Cómo detengo un script bash hasta que un usuario ha presionado Space?
Me gustaría tener la pregunta en mi guión
Presione la barra espaciadora para continuar o CTRL+ Cpara salir
y luego el script debe detenerse y esperar hasta que se presione Space.
¿Cómo detengo un script bash hasta que un usuario ha presionado Space?
Me gustaría tener la pregunta en mi guión
Presione la barra espaciadora para continuar o CTRL+ Cpara salir
y luego el script debe detenerse y esperar hasta que se presione Space.
Respuestas:
Puedes usar read:
read -n1 -r -p "Press space to continue..." key
if [ "$key" = '' ]; then
# Space pressed, do something
# echo [$key] is empty when SPACE is pressed # uncomment to trace
else
# Anything else pressed, do whatever else.
# echo [$key] not empty
fi
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
elsebloque siempre se ejecuta, incluso cuando se presiona la barra espaciadora.
bash. Funciona si lo usas read _, si tienes otro shell que no sea bash.
''contener un espacio dentro?
''para una cadena vacía. No hay espacio adentro. Supongo que también encaja si ingresas ENTER o TAB
El método discutido en estas preguntas y respuestas sobre SO es probablemente el mejor candidato para una alternativa al pausecomportamiento al que está acostumbrado en Windows cuando hace archivos BAT.
$ read -rsp $'Press any key to continue...\n' -n1 key
Aquí estoy ejecutando lo anterior y luego simplemente presiono cualquier tecla, en este caso la Dtecla.
$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$
$antes de la cadena aquí -rsp $'Press:?
echo -e "..."líneas adicionales . Es mucho más compacto en esas situaciones.
hold=' '
printf "Press 'SPACE' to continue or 'CTRL+C' to exit : "
tty_state=$(stty -g)
stty -icanon
until [ -z "${hold#$in}" ] ; do
in=$(dd bs=1 count=1 </dev/tty 2>/dev/null)
done
stty "$tty_state"
Esto ahora imprime un mensaje sin una nueva línea final, se maneja de CTRL+Cmanera confiable, invoca sttysolo con la frecuencia necesaria y restaura el tty de control exactamente al estado en el que se sttyencontró. Busque man sttyinformación sobre cómo controlar explícitamente los ecos, los caracteres de control y todo.
También puedes hacer esto:
printf "Press any key to continue or 'CTRL+C' to exit : "
(tty_state=$(stty -g)
stty -icanon
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
stty "$tty_state"
) </dev/tty
Podrías hacerlo ENTER, sin [pruebas ]y sin sttygusto:
sed -n q </dev/tty
Podrías crear una función para ello:
pause(){
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}
Entonces puedes usar esto en todas partes en tu script:
pause
La configuración IFSpara vaciar la cadena suprime el comportamiento predeterminado de lectura de recortar espacios en blanco.
try_this() {
echo -n "Press SPACE to continue or Ctrl+C to exit ... "
while true; do
# Set IFS to empty string so that read doesn't trim
# See http://mywiki.wooledge.org/BashFAQ/001#Trimming
IFS= read -n1 -r key
[[ $key == ' ' ]] && break
done
echo
echo "Continuing ..."
}
try_this
ACTUALIZACIÓN 2018-05-23: Podemos simplificar esto usando la variable REPLY, que no está sujeta a división de palabras:
try_this() {
echo -n "Press SPACE to continue or Ctrl+C to exit ... "
while true; do
read -n1 -r
[[ $REPLY == ' ' ]] && break
done
echo
echo "Continuing ..."
}
try_this
Aquí hay una manera que funciona en ambos bashy zsh, y asegura E / S al 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
¡Ponlo en tu .{ba,z}shrcpara Gran Justicia!