Presione la barra espaciadora para continuar

¿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

  • Todo esto y más se trata en este SO Q & A BTW: ¿Cuál es el equivalente de Linux? a la pausa de DOS?
  • Ver también: Pausar el script Shell hasta que presione Enter en el ciclo while
  • relacionado: unix.stackexchange.com/questions/293940/…
  • 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

    • Debe agregar -s para no imprimir el carácter presionado en la terminal. Y agregue un salto de línea al final, o la salida continuará directamente en la misma línea como la pregunta. Lo mejor sería: read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
    • Esta secuencia de comandos no ‘ no funciona. Acabo de probarlo en Red Hat Linux … El bloque else siempre se ejecuta, incluso cuando se presiona la barra espaciadora.
    • @robert It ‘ s porque no ‘ t usa bash. Funciona si usa read _ en su lugar, si tiene algún otro shell que bash.
    • ¿Debería '' ¿contiene un espacio en el interior?
    • Esto se lee en STDIN, lo que provocará problemas dado pipeline | script.sh Ver esta respuesta para una solución.

    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.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *