¿Cómo detengo mi script de shell por un segundo antes de continuar?

702

Solo he encontrado cómo esperar la entrada del usuario. Sin embargo, solo quiero hacer una pausa para que while truemi computadora no se bloquee.

Lo intenté pause(1), pero dice -bash: syntax error near unexpected token '1'. ¿Cómo puede hacerse esto?

codeforester
fuente

Respuestas:

1231

Usa el sleepcomando.

Ejemplo:

sleep .5 # Waits 0.5 second.
sleep 5  # Waits 5 seconds.
sleep 5s # Waits 5 seconds.
sleep 5m # Waits 5 minutes.
sleep 5h # Waits 5 hours.
sleep 5d # Waits 5 days.

También se pueden emplear decimales al especificar una unidad de tiempo; p.ejsleep 1.5s

RydallCooper
fuente
12
¡Siempre lo olvido sleep! ( pause,, waito delaytendría más sentido y sería más fácil de recordar.)
Geremia
47
Parece que en Mac OS X, s, m, h, yd no tienen ningún impacto. Debe especificar el tiempo en segundos.
El arquitecto AI
66
Creo que el nombramiento se debe a que tenemos thread.sleepfunciones en muchos lenguajes de programación @Geremia
Amin_mmz
89

Y que hay con:

read -p "Press enter to continue"
Vonton
fuente
35
En realidad, esto respondió mi pregunta, incluso si no responde al OP.
Jesse Chisholm
99
Esto no tiene nada que ver con esta publicación.
Murtadha S.
66
@murtadhaalsabbagh, pero tiene mucho que ver con la indexación de Google :) También me ayudó, por cierto.
Iulian Onofrei
lee -p "Presiona enter para continuar" -t 1 debería pausar por 1 segundo
SzB
@JesseChisholm Supongo que la gente está buscando el equivalente bash del powershell / cmdPAUSE
rovyko
66

En Python (la pregunta se etiquetó originalmente como Python), debe importar el módulo de tiempo

import time
time.sleep(1)

o

from time import sleep
sleep(1)

Para el script de shell es solo

sleep 1

Que ejecuta el sleepcomando. p.ej./bin/sleep

John La Rooy
fuente
55
sí, esto también lo dice, es solo que el otro fue el primero, y tiene un buen ejemplo :) ¡pero +1!
3
Entonces, aunque no es la forma correcta de hacerlo, puede combinar la respuesta de Python con Bash usando en python -c "import time; time.sleep(1)"lugar de sleep 1:)
Berry M.
2
@BerryM. - Toma alrededor de 1.2 segundos cuando lo intento. Python no se inicia instantáneamente, debe tener en cuenta eso. Hazlo en su python -c "import time; time.sleep(0.8)"lugar. Pero luego tenemos que tener en cuenta cuánto tiempo dura realmente el inicio de Python. Necesita ejecutar esto: date +%N; python -c "import time; time.sleep(0)"; date +%Npara determinar cuántos nanosegundos tarda Python en comenzar. Pero eso también incluye algunos gastos generales desde la fecha de ejecución. Ejecute esto date +%N; date +%Npara encontrar esa sobrecarga. La sobrecarga de Python en mi máquina estaba realmente más cerca de 0.14 segundos. Entonces yo quiero time.sleep(0.86).
ArtOfWarfare
Es cierto, aunque nunca obtendrás exactamente 1000 ms, ni siquiera así.
Berry M.
Por lo general, la especificación es al menos la cantidad de tiempo dada, que generalmente se adapta al propósito del sueño.
Marlin Pierce
40

Me doy cuenta de que llego un poco tarde con esto, pero también puedes llamar a dormir y pasar el tiempo de espera. Por ejemplo, si quisiera esperar 3 segundos, puedo hacer:

/bin/sleep 3

4 segundos se verían así:

/bin/sleep 4
pcmaster574
fuente
55
Me topé con esto, es porque la respuesta mejor votada, @RyndallCooper, enojada casi un año antes, tiene -59x más puntos y va mucho más en profundidad, y esta todavía aparece por encima de ella simplemente por ser más reciente.
Aido
2
@AidanEdwards Fue la mejor respuesta para mí también hasta que ordené por "votos" (que es el valor predeterminado; me pregunto cómo se configuró como "activo"). Sin embargo, establecerlo en "votos" lo arregló. Extraño.
christianbundy
1
@stackoverflow: ustedes deberían cambiar cómo funciona ... ¡mantengan a los mejores votados siempre primero!
Deian
3
"Es porque la respuesta más votada ... todavía aparece por encima de ella simplemente por ser más reciente" - uhhh, no, NUNCA se debe rechazar una respuesta por razones tan frívolas no relacionadas con el mal contenido en esa respuesta.
Nicholas Petersen
35

En Mac OSX, la suspensión no toma minutos / etc, solo segundos. Entonces por dos minutos,

sleep 120
AnneTheAgile
fuente
27

Ejecuta múltiples durmientes y comandos

sleep 5 && cd /var/www/html && git pull && sleep 3 && cd ..

Esto esperará 5 segundos antes de ejecutar el primer script, luego volverá a dormir durante 3 segundos antes de que vuelva a cambiar de directorio.

Niño robot
fuente
44
+1 ... porque si usas un ampers y después del sueño, envía el sueño a su propio hilo e inmediatamente comienza la siguiente acción (es decir, el sueño no retrasa la próxima acción)
Jay Marm
18

Dentro de la secuencia de comandos, puede agregar lo siguiente entre las acciones en las que desea la pausa. Esto pausará la rutina durante 5 segundos.

read -p "Pause Time 5 seconds" -t 5
read -p "Continuing in 5 Seconds...." -t 5
echo "Continuing ...."
Jose H. Rosa
fuente
Esto realmente no funcionará, ¿verdad? Creo que -t 5eso abortará el guión después de 5 segundos, no continuará, al menos según esta página de manual para leer
Brad Parks,
@BradParks Sí, funcionará Por si acaso: root @ Joses-iPad: ~ # cat readtest.bash #! / Bin / bash echo "Aquí" lee -p "Tiempo de pausa 5 segundos" -t 5 lee -p "Continúa en 5 segundos .... "-t 5 echo" Continuando .... "echo" Allí "root @ Joses-iPad: ~ # cat re./st.bash Aquí Pausa Tiempo 5 segundos Continuando en 5 segundos .... Continuando .... Allí
Jose H. Rosa
Hmmm ... creo que tienes razón! Pensé que había intentado esto, pero lo intenté nuevamente y funciona como se anuncia. ¡Gracias!
Brad Parks el
5

read -r -p "Wait 5 seconds or press any key to continue immediately" -t 5 -n 1 -s

Para continuar cuando presiona cualquier botón

Wairua
fuente
77
Si bien este fragmento de código puede ser la solución, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código.
paz
1
Esta respuesta es un comentario de solo código. No intenta explicar el código dado. Siento que el cartel malinterpretó la pregunta como "¿Cómo espero la entrada del usuario mientras simultáneamente tengo un tiempo de espera en esa entrada del usuario"
Zimano
2

Puede hacerlo esperar usando $ RANDOM, un generador de números aleatorios predeterminado. En el siguiente estoy usando 240 segundos. Espero que ayude @

> WAIT_FOR_SECONDS=`/usr/bin/expr $RANDOM % 240` /bin/sleep
> $WAIT_FOR_SECONDS
Balaji Boggaram Ramanarayan
fuente
1

use trap para pausar y verificar la línea de comando antes de ejecutar

trap 'tput setaf 1;tput bold;echo $BASH_COMMAND;read;tput init' DEBUG

Pulse cualquier tecla para continuar

utilizar con set -xpara depurar la línea de comando

Akhil J
fuente