Comment mettre en pause mon script shell pendant une seconde avant de continuer?

702

Je n'ai trouvé que comment attendre la saisie de l'utilisateur. Cependant, je veux seulement faire une pause afin que mon while truene plante pas mon ordinateur.

J'ai essayé pause(1), mais ça dit -bash: syntax error near unexpected token '1'. Comment ceci peut être fait?

codeforester
la source

Réponses:

1231

Utilisez la sleepcommande.

Exemple:

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.

On peut également utiliser des décimales pour spécifier une unité de temps; par exemplesleep 1.5s

RydallCooper
la source
12
J'oublie toujours ça sleep! ( pause,, waitou delayserait plus logique et plus facile à retenir.)
Geremia
47
Il semble que sur Mac OS X, les s, m, h et d n'aient aucun impact. Vous devez spécifier le temps en secondes.
The AI ​​Architect
6
Je pense que la dénomination est parce que nous avons une thread.sleepfonction dans de nombreux langages de programmation @Geremia
Amin_mmz
89

Et à propos de:

read -p "Press enter to continue"
Vonton
la source
35
En fait, cela a répondu à ma question, même si cela ne répond pas au PO.
Jesse Chisholm
9
cela n'a rien à voir avec ce post.
Murtadha S.
6
@murtadhaalsabbagh, Mais cela a beaucoup à voir avec l'indexation de Google :) M'a aussi aidé, btw.
Iulian Onofrei
lire -p "Appuyez sur Entrée pour continuer" -t 1 devrait faire une pause pendant 1 sec
SzB
@JesseChisholm Je suppose que les gens recherchent l'équivalent bash du powershell / cmdPAUSE
rovyko
66

En Python (la question était à l'origine étiquetée Python), vous devez importer le module de temps

import time
time.sleep(1)

ou

from time import sleep
sleep(1)

Car le script shell est juste

sleep 1

Qui exécute la sleepcommande. par exemple./bin/sleep

John La Rooy
la source
5
oui, cela le dit aussi, c'est juste l'autre qui était le premier, et il a un bel exemple :) mais +1!
3
Donc, bien que ce ne soit pas la bonne façon de le faire, vous pouvez combiner la réponse python avec Bash en utilisant à la python -c "import time; time.sleep(1)"place de sleep 1:)
Berry M.
2
@BerryM. - Prend environ 1,2 seconde lorsque je l'essaye. Python ne démarre pas instantanément - vous devez en tenir compte. Faites-le à la python -c "import time; time.sleep(0.8)"place. Mais nous devons ensuite prendre en compte le temps de démarrage de python. Vous devez exécuter ceci: date +%N; python -c "import time; time.sleep(0)"; date +%Npour déterminer combien de nanosecondes python prend pour démarrer. Mais cela inclut également des frais généraux à partir de la date de fonctionnement. Exécutez ceci date +%N; date +%Npour trouver ce surcoût. La surcharge de Python sur ma machine était en fait plus proche de 0,14 seconde. Alors je veux time.sleep(0.86).
ArtOfWarfare
Certes, même si vous n'obtiendrez jamais exactement 1000 ms, même pas comme ça.
Berry M.
En règle générale, la spécification est au moins la durée donnée, qui convient généralement à l'objectif du sommeil.
Marlin Pierce
40

Je me rends compte que je suis un peu en retard avec cela, mais vous pouvez également appeler le sommeil et passer le temps désiré. Par exemple, si je voulais attendre 3 secondes, je peux faire:

/bin/sleep 3

4 secondes ressemblerait à ceci:

/bin/sleep 4
pcmaster574
la source
5
Je suis juste tombé sur cela, c'est parce que la réponse la plus votée, celle de @RyndallCooper, folle presque un an auparavant, a -59x autant de points et va beaucoup plus en profondeur, et celle-ci apparaît toujours au-dessus d'elle simplement en étant plus récente.
Aido
2
@AidanEdwards C'était aussi la meilleure réponse pour moi jusqu'à ce que je trie par "votes" (ce qui est la valeur par défaut - je me demande comment il a été réglé sur "actif"?). Le mettre à "votes" l'a cependant corrigé. Bizarre.
christianbundy
1
@stackoverflow - vous devriez changer la façon dont cela fonctionne ... gardez toujours le premier voté!
Deian
3
"c'est parce que la réponse la plus votée ... apparaît toujours au-dessus d'elle simplement en étant plus récente" - euhhh, non, il ne faut JAMAIS voter contre une réponse pour des raisons aussi frivoles qui ne sont pas liées à un mauvais contenu dans cette réponse.
Nicholas Petersen
35

Sur Mac OSX, le sommeil ne prend pas des minutes / etc, seulement quelques secondes. Donc, pendant deux minutes,

sleep 120
AnneTheAgile
la source
27

Exécuter plusieurs mises en veille et commandes

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

Cela attendra 5 secondes avant d'exécuter le premier script, puis s'endormira à nouveau pendant 3 secondes avant de changer de répertoire à nouveau.

Robot Boy
la source
4
+1 ... cuz si vous utilisez une esperluette après le sommeil, elle envoie le sommeil à son propre thread puis démarre immédiatement l'action suivante (c'est-à-dire que le sommeil ne retarde pas la prochaine action)
Jay Marm
18

Dans le script, vous pouvez ajouter ce qui suit entre les actions que vous souhaitez mettre en pause. Cela interrompra la routine pendant 5 secondes.

read -p "Pause Time 5 seconds" -t 5
read -p "Continuing in 5 Seconds...." -t 5
echo "Continuing ...."
Jose H. Rosa
la source
Cela ne fonctionnera pas réellement, n'est-ce pas? Je pense que -t 5cela abandonnera le script après 5 secondes, ne continuera pas, du moins selon cette page de manuel à lire
Brad Parks
@BradParks Oui, cela fonctionnera Au cas où: root @ Joses-iPad: ~ # cat readtest.bash #! / Bin / bash echo "Here" read -p "Pause Time 5 seconds" -t 5 read -p "Continue in 5 secondes .... "-t 5 echo" Continue .... "echo" Là "root @ Joses-iPad: ~ # cat re./st.bash Here Pause Time 5 secondsContinuing in 5 Seconds .... Continue .... Là
Jose
Hmmm .... Je pense que vous avez raison! Je pensais avoir essayé cela, mais je l'ai juste réessayé et cela fonctionne comme annoncé. Merci!
Brad Parks
5

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

Pour continuer lorsque vous appuyez sur un bouton

Wairua
la source
7
Bien que cet extrait de code puisse être la solution, y compris une explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondrez à la question pour les lecteurs à l'avenir, et ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
peacetype
1
Cette réponse est un commentaire de code uniquement. Il n'essaie pas d'expliquer le code donné. Je pense que l'affiche a mal interprété la question comme "Comment puis-je attendre la saisie de l'utilisateur tout en ayant un délai d'expiration sur cette saisie"
Zimano
2

Vous pouvez le faire attendre en utilisant $ RANDOM, un générateur de nombres aléatoires par défaut. Dans ce qui suit, j'utilise 240 secondes. J'espère que cela pourra aider @

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

utiliser trap pour mettre en pause et vérifier la ligne de commande avant d'exécuter

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

Appuyez sur n'importe quelle touche pour continuer

utiliser avec set -xpour déboguer la ligne de commande

Akhil J
la source