linux - pause - mp3tag
¿Cuál es el equivalente de Linux a la pausa de DOS? (9)
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 "pause". ¿Hay un equivalente de Linux que pueda usar en mi script?
Esta función funciona tanto en bash
como en zsh
, y garantiza 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
para Great Justice!
Esto me funcionó en múltiples versiones de Linux, donde algunas de estas otras soluciones no funcionaron (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 una variable debe suministrarse como un argumento para read
.
Prueba esto:
function pause(){
read -p "$*"
}
Sí al uso de read
, y hay un par de ajustes que lo hacen más útil tanto en cron
como en la terminal.
Ejemplo:
time rsync (options)
read -n 120 -p "Press ''Enter'' to continue..." ; echo " "
El -n 120 hace que la instrucción de lectura se agote después de 2 minutos, por lo que no se bloquea en cron
.
En la terminal, se obtienen 2 minutos para ver cuánto tiempo tardó en ejecutarse el comando rsync
.
Luego, el echo
subsiguiente es así que el mensaje de bash subsiguiente aparecerá en la siguiente línea.
De lo contrario, se mostrará en la misma línea directamente después de "continuar ..." cuando se presione Intro en el terminal.
Si solo necesita pausar un bucle o secuencia de comandos, y está feliz de presionar Intro 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 los que está escribiendo un script rápido para usted, y necesita pausarlo para hacer algo manualmente en segundo plano.
Utilizo mucho estos caminos que son muy cortos, 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 un bucle hasta que el usuario presiona Enter .
Comandos
Entrar en 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;
Alias mejorado para dormir
read -rst 0.5; timeout=$? # echo $timeout
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 el prompt, 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 citas simples.
-d $ '' / e '' especifica escappe como carácter delimitador, por lo que como carácter final de la entrada actual, es posible colocar cualquier carácter, pero tenga cuidado de colocar 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
servicio de teclas en caso de que necesite conocer la entrada, en el caso de -n1, la tecla que se presionó.
PS Sirve 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 tan pronto como sea posible si necesita probarla después de algunos comandos, porque todos los comandos reescribirían $?
read -n1
no es portable. 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 la read
, con solo presionar ENTER
para continuar, se puede hacer lo siguiente:
sed -n q </dev/tty
read
hace esto:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
La -n1
especifica que solo espera un solo carácter. La -r
pone en modo crudo, lo cual es necesario porque de lo contrario, si presionas algo como barra diagonal inversa, no se registra hasta que presionas la siguiente tecla. La -p
especifica la solicitud, que debe ser citada si contiene espacios. El argumento key
solo es necesario si desea saber qué tecla presionaron, en cuyo caso puede acceder a través de $key
.
Si está utilizando Bash, también puede especificar un tiempo de espera con -t
, lo que hace que la lectura devuelva una falla 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
read
sin ningún parámetro solo continuará si presiona Intro. El comando de pause
DOS continuará si presiona cualquier tecla. Usa read –n1
si quieres este comportamiento.