¿Cuál es el equivalente de Linux a la pausa de DOS?

Tengo un script de shell Bash en el que me gustaría poner en pausa la ejecución hasta que el usuario presione una tecla. En DOS, esto se logra fácilmente con el comando “pausa”. ¿Existe un equivalente de Linux que pueda usar en mi script?

Utilizo estas formas mucho que son muy cortas, y son como las soluciones @theunamedguy y @Jim, pero con tiempo de espera y modo silencioso además.

Me encanta especialmente el último caso y lo uso en muchos scripts que se ejecutan en un bucle hasta que el usuario presiona Enter .

Comandos

  • 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 elecció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; 
  • Sleep mejorado alias

     read -rst 0.5; timeout=$? # echo $timeout 

Explicación

-r especifica el modo raw, 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 personajes escapados, de lo contrario, puede utilizar comillas simples.

-d $ ‘ \ e especifica escappe como delimitador, 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 solo carácter.

-e especifica el modo de lectura.

-i $ ‘ Y especifica Y como texto inicial en modo lectura.

-t 5 especifica un tiempo de espera de 5 segundos

servir clave en caso de que necesite conocer la entrada, en -n1 caso, la tecla que se ha presionado.

ps sirve para conocer el código de salida del último progtwig, para leer, 142 en caso de tiempo de espera, 0 entrada correcta. Poner $? en una variable lo antes posible si necesita probarlo después de algunos comandos, porque todos los comandos reescribirían $?

read sin ningún parámetro solo continuará si presiona enter. El comando pause DOS continuará si presiona cualquier tecla. Use read –n1 si quiere este comportamiento.

Esto funcionó para mí en múltiples sabores de Linux, donde algunas de estas otras soluciones no lo hicieron (incluso las más populares aquí). Creo que es más legible también …

 echo Press enter to continue; read dummy; 

Tenga en cuenta que una variable debe suministrarse como un 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 )  

Además de usar read , solo con presionar ENTER para continuar, puede hacer lo siguiente:

 sed -nq  

Si solo necesita pausar un bucle o una secuencia de comandos, y está contento de presionar Enter en lugar de cualquier tecla, read por sí solo hará el trabajo.

 do_stuff read do_more_stuff 

No es amigable para el usuario final, pero puede ser suficiente en los casos en que está escribiendo un guión rápido para usted, y necesita pausarlo para hacer algo manualmente en segundo plano.

Esta función funciona tanto en bash como en zsh , y asegura la entrada / salida a la 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 ]] &&  

Ponlo en tu .{ba,z}shrc por Gran Justicia!

Sí a usar 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 sentencia de lectura expire después de 2 minutos, por lo que no se bloquea en cron .

En el terminal, da 2 minutos para ver cuánto tiempo le llevó ejecutar el comando rsync .

Luego, el echo subsiguiente es para que el siguiente aviso de bash aparezca en la siguiente línea.

De lo contrario, aparecerá en la misma línea directamente después de “continuar …” cuando se presione Entrar en el terminal.

Prueba esto:

 function pause(){ read -p "$*" }