¿Cómo detengo un script bash hasta que un usuario haya presionado barra espaciadora ?
Me gustaría tener la pregunta en mi script
Presione la barra espaciadora para continuar o CTRL + C para salir
y luego la secuencia de comandos debe detenerse y esperar hasta que se presione la barra espaciadora.
Comentarios
Respuesta
Puede usar read
:
read -n1 -s -r -p $"Press space to continue...\n" 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
Reemplaza " "
para el espacio arriba con ""
para la tecla Enter, $"\t"
para la tecla Tab.
Comentarios
Respuesta
El método discutido en este SO Q & A es probablemente el mejor candidato para una alternativa al comportamiento pause
al que «estás acostumbrado en Windows cuando haciendo archivos BAT.
$ read -rsp $"Press any key to continue...\n" -n1 key
Ejemplo
Aquí estoy ejecutando lo anterior y luego simplemente presionando cualquier tecla, en este caso la D clave.
$ read -rsp $"Press any key to continue...\n" -n1 key Press any key to continue... $
Referencias
Comentarios
- Me refiero a por qué
$
antes ¿Está la cadena aquí:-rsp $'Press
? - @ rubo77 – ah. Esa ‘ es la forma en que puedes hacer una cadena literal con caracteres especiales. Tiene ‘ s de la forma: $ ‘ … ‘
- @ rubo77: eso ‘ es diferente. Que ‘ es un signo de dólar con comillas dobles, yo usé un dólar con comillas simples. Elimine ese comentario, ‘ no es correcto.
- Ah, lo entiendo. En caso de que coloque secuencias de escape dentro de la cadena de solicitud. ver wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
- @ rubo77 – sí, esa notación permite que se incluyan secuencias de escape sin ninguna
echo -e "..."
líneas adicionales. Es ‘ es mucho más compacto en esas situaciones.
Respuesta
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 cualquier parte de tu script:
pause
Comentarios
- si es nuevo en la creación de scripts de shell, debe colocar la función en la parte superior de su script antes de usarla
Responder
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 al final, maneja CTRL+C
de manera confiable, invoca stty
solo con la frecuencia necesaria y restaura el tty controlador al estado exacto en el que stty
lo encontró. Busque en man stty
para obtener información sobre cómo controlar explícitamente los ecos, los caracteres de control y todo.
También puede 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 con ENTER
, sin [
pruebas ]
y sin stty
como:
sed -n q </dev/tty
Comentarios
- Sus dos últimas soluciones parecen funcionar bien con
/bin/sh
(por ejemplo, en FreeBSD) también, no solo con bash. - es su respuesta en SO equivalente, o incluso mejor?
Respuesta
Aquí «una forma que funciona tanto en bash
y zsh
, y asegura la 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}shrc
¡por la Gran Justicia!
Respuesta
una frase perezosa:
echo "Press any key to continue or Ctrl+C to cancel" read && do_something.sh
la desventaja es que pierde el control cuando el usuario presiona ctrl + c. El script siempre saldrá con el código 130 en ese caso.
Responder
La configuración IFS
para una cadena vacía 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 utilizando la variable REPLY, que no está sujeta a la 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
Responder
Aquí «una solución simple de Presione ESPACIO para continuar (no ENTRAR)
read -s -d " "
Esto esperará hasta que presione la barra espaciadora. Sí, solo la barra espaciadora, no se rompería si presionas enter.
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
siempre se ejecuta, incluso cuando se presiona la barra espaciadora.bash
. Funciona si usaread _
en su lugar, si tiene algún otro shell quebash
.''
¿contiene un espacio en el interior?pipeline | script.sh
Ver esta respuesta para una solución.