Respuestas:
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
Press a key to continue...
, incluso los usuarios novatos podrán encontrar la a
tecla y presionarla; o)
command | myscript.sh
o myscript.sh | command
. Vea esta respuesta para una solución.
read: 1: read: Illegal option -n
asegura, envuelva su comando en bash -c 'command && command'
etc., ya que es probable que se produzca ese error sh
. 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.
Introducir solución
read -rsp $'Press enter to continue...\n'
Solución de escape (con -d $ '\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
Cualquier solución clave (con -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
Pregunta con opción preseleccionada (con -ei $ 'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
Solución de tiempo de espera (con -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
Sueño mejorado alias
read -rst 0.5; timeout=$?
# echo $timeout
-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 $?
-s
; man read
y la read --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 #osx read -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.
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 ...
echo Press enter to continue; read dummy;
Tenga en cuenta que se debe proporcionar una variable como argumento para read
.
read -n1
No es portátil. Una forma portátil de hacer lo mismo podría ser:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
Además de usar read
, solo por presionar ENTER
para continuar, puede hacer lo siguiente:
sed -n q </dev/tty
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.
do_stuff
read
do_more_stuff
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.
Prueba esto:
function pause(){
read -p "$*"
}
Esta función funciona en ambos bash
y zsh
, y asegura 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
para Gran Justicia!
Sí al uso read
, y hay un par de ajustes que lo hacen más útil tanto cron
en el terminal como en el terminal.
Ejemplo:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
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.
"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.