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 -n1
especifica que sólo espera a que un solo carácter. Lo -r
pone 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 -p
especifica el indicador, que deberá indicarse si contiene espacios. El key
argumento 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
...).bash
ignora los caracteres NUL.Press a key to continue...
, incluso los usuarios novatos podrán encontrar laa
tecla y presionarla; o)command | myscript.sh
omyscript.sh | command
. Vea esta respuesta para una solución.read: 1: read: Illegal option -n
asegura, 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 read
y laread --help
ayuda no ayudó en Ubuntu 10.04.1 LTS. Editar:help read
hizo; ¿El resto está en desuso?read: -i: invalid option
por 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. `-i
funciona perfectamente en Ubuntu, tampoco sé cómo-d
funciona de la misma manera en OSX.read
sin ningún parámetro solo continuará si presiona enter. Elpause
comando DOS continuará si presiona cualquier tecla. Úseloread –n1
si 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 -n1
No es portátil. Una forma portátil de hacer lo mismo podría ser:Además de usar
read
, solo por presionarENTER
para continuar, puede hacer lo siguiente:fuente
status=none
tampoco es portátil. Redirige stdout y stderr a / dev / null en su lugar.read -r line < /dev/tty
sería lo suficientemente para pulsar ENTER ... .settings=$(stty -g); stty raw; dd ...; stty "$settings"
para guardar y restaurar la configuración de tty.tr
edición también podría funcionar?tr
amortiguaría su salida como una tubería, y los teclados no estadounidenses tienen teclas que envían caracteres fuera del\1-\177
rango.dd
Es 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
read
por 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
bash
yzsh
, y asegura E / S al terminal:¡Ponlo en tu
.{ba,z}shrc
para Gran Justicia!fuente
Sí al uso
read
, y hay un par de ajustes que lo hacen más útil tantocron
en 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
rsync
tardó en ejecutarse el comando.Luego, lo siguiente
echo
es 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