¿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.
bash
control-flow
rubo77
fuente
fuente
Respuestas:
Puedes usar
read
:fuente
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
bloque siempre se ejecuta, incluso cuando se presiona la barra espaciadora.bash
. Funciona si lo usasread _
, si tienes otro shell que no seabash
.''
contener un espacio dentro?''
para una cadena vacía. No hay espacio adentro. Supongo que también encaja si ingresas ENTER o TABEl método discutido en estas preguntas y respuestas sobre SO es probablemente el mejor candidato para una alternativa al
pause
comportamiento al que está acostumbrado en Windows cuando hace archivos BAT.Ejemplo
Aquí estoy ejecutando lo anterior y luego simplemente presiono cualquier tecla, en este caso la Dtecla.
Referencias
fuente
$
antes de la cadena aquí-rsp $'Press
:?echo -e "..."
líneas adicionales . Es mucho más compacto en esas situaciones.Esto ahora imprime un mensaje sin una nueva línea final, se maneja de
CTRL+C
manera confiable, invocastty
solo con la frecuencia necesaria y restaura el tty de control exactamente al estado en el que sestty
encontró. Busqueman stty
información sobre cómo controlar explícitamente los ecos, los caracteres de control y todo.También puedes hacer esto:
Podrías hacerlo
ENTER
, sin[
pruebas]
y sinstty
gusto:fuente
Podrías crear una función para ello:
Entonces puedes usar esto en todas partes en tu script:
fuente
un forro perezoso:
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.
fuente
La configuración
IFS
para vaciar la cadena suprime el comportamiento predeterminado de lectura de recortar espacios en blanco.ACTUALIZACIÓN 2018-05-23: Podemos simplificar esto usando la variable REPLY, que no está sujeta a división de palabras:
fuente
Aquí hay una manera que funciona en ambos
bash
yzsh
, y asegura E / S al terminal:¡Ponlo en tu
.{ba,z}shrc
para Gran Justicia!fuente