Tengo un script de shell Bash en el que me gustaría pausar la ejecución hasta que el usuario presione una tecla. En DOS, esto se logra fácilmente con el comando "pausa". ¿Hay un equivalente de Linux que pueda usar en mi script?
236
read Haz esto:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
Las -n1especifica que sólo espera a que un solo carácter. Lo -rpone en modo sin formato, lo cual es necesario porque de lo contrario, si presiona algo como la barra invertida, no se registrará hasta que presione la siguiente tecla. Las -pespecifica el indicador, que deberá indicarse si contiene espacios. El keyargumento solo es necesario si desea saber qué tecla presionaron, en cuyo caso puede acceder a ella $key.
Si está utilizando Bash, también puede especificar un tiempo de espera con -t, lo que hace que la lectura devuelva un error cuando no se presiona una tecla. Así por ejemplo:
read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
echo 'A key was pressed.'
else
echo 'No key was pressed.'
fi
"Enter any non-NUL character to continue". Algunas teclas no envían ningún carácter (comoCtrl...) y otras envían más de uno (comoF1,Home...).bashignora los caracteres NUL.Press a key to continue..., incluso los usuarios novatos podrán encontrar laatecla y presionarla; o)command | myscript.shomyscript.sh | command. Vea esta respuesta para una solución.read: 1: read: Illegal option -nasegura, envuelva su comando enbash -c 'command && command'etc., ya que es probable que se produzca ese errorsh. Estoy haciendo esto en un comando de contenedor Lando.Utilizo mucho estas formas que son muy cortas, y son como las soluciones @theunamedguy y @Jim, pero con tiempo de espera y modo silencioso además.
Especialmente me encanta el último caso y lo uso en muchos scripts que se ejecutan en bucle hasta que el usuario presiona Enter.
Comandos
Introducir solución
Solución de escape (con -d $ '\ e')
Cualquier solución clave (con -n 1)
Pregunta con opción preseleccionada (con -ei $ 'Y')
Solución de tiempo de espera (con -t 5)
Sueño mejorado alias
Explicación
-r especifica el modo sin formato, que no permite caracteres combinados como "\" o "^".
-s especifica el modo silencioso y porque no necesitamos salida de teclado.
-p $ ' prompt ' especifica la solicitud, que debe estar entre $ 'y' para dejar espacios y caracteres escapados. Tenga cuidado, debe poner entre comillas simples con el símbolo de dólares para beneficiar a los caracteres escapados, de lo contrario puede usar comillas simples.
-d $ ' \ e ' especifica escappe como delimitador de caracteres, por lo que, como carácter final para la entrada actual, es posible poner cualquier carácter, pero tenga cuidado de poner un carácter que el usuario pueda escribir.
-n 1 especifica que solo necesita un único carácter.
-e especifica el modo readline.
-i $ ' Y ' especifica Y como texto inicial en modo readline.
-t 5 especifica un tiempo de espera de 5 segundos
Tecla servir en caso de que necesite conocer la entrada, en el caso -n1, la tecla que se ha presionado.
PS sirven para conocer el código de salida del último programa, para leer, 142 en caso de tiempo de espera, 0 entrada correcta. Poner $? en una variable lo antes posible si necesita probarla después de algunos comandos, porque todos los comandos reescribirán $?
fuente
-s;man ready laread --helpayuda no ayudó en Ubuntu 10.04.1 LTS. Editar:help readhizo; ¿El resto está en desuso?read: -i: invalid optionpor el ex.read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;en #osxread -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;funciona para mí en su lugar. `-ifunciona perfectamente en Ubuntu, tampoco sé cómo-dfunciona de la misma manera en OSX.readsin ningún parámetro solo continuará si presiona enter. Elpausecomando DOS continuará si presiona cualquier tecla. Úseloread –n1si desea este comportamiento.fuente
Esto funcionó para mí en múltiples versiones de Linux, donde algunas de estas otras soluciones no lo hicieron (incluidas las más populares aquí). Creo que también es más legible ...
Tenga en cuenta que se debe proporcionar una variable como argumento para
read.fuente
read -n1No es portátil. Una forma portátil de hacer lo mismo podría ser:Además de usar
read, solo por presionarENTERpara continuar, puede hacer lo siguiente:fuente
status=nonetampoco es portátil. Redirige stdout y stderr a / dev / null en su lugar.read -r line < /dev/ttysería lo suficientemente para pulsar ENTER ... .settings=$(stty -g); stty raw; dd ...; stty "$settings"para guardar y restaurar la configuración de tty.tredición también podría funcionar?tramortiguaría su salida como una tubería, y los teclados no estadounidenses tienen teclas que envían caracteres fuera del\1-\177rango.ddEs la manera idiomática aquí.Si solo necesita pausar un bucle o secuencia de comandos, y está feliz de presionar Enter en lugar de cualquier tecla, entonces
readpor sí solo hará el trabajo.No es fácil de usar para el usuario final, pero puede ser suficiente en los casos en que está escribiendo un script rápido para usted y necesita pausarlo para hacer algo manualmente en segundo plano.
fuente
Prueba esto:
fuente
Esta función funciona en ambos
bashyzsh, y asegura E / S al terminal:¡Ponlo en tu
.{ba,z}shrcpara Gran Justicia!fuente
Sí al uso
read, y hay un par de ajustes que lo hacen más útil tantocronen el terminal como en el terminal.Ejemplo:
El -n 120 hace que la instrucción de lectura termine el tiempo de espera después de 2 minutos para que no se bloquee
cron.En la terminal, da 2 minutos para ver cuánto tiempo
rsynctardó en ejecutarse el comando.Luego, lo siguiente
echoes para que aparezca el indicador de bash posterior en la siguiente línea.De lo contrario, se mostrará en la misma línea directamente después de "continuar ..." cuando Enterse presiona en el terminal.
fuente