Wie pausiere ich mein Shell-Skript für eine Sekunde, bevor ich fortfahre?


701

Ich habe nur gefunden, wie man auf Benutzereingaben wartet. Ich möchte jedoch nur eine Pause einlegen, damit while truemein Computer nicht abstürzt.

Ich habe es versucht pause(1), aber es heißt -bash: syntax error near unexpected token '1'. Wie geht das?

Antworten:


1231

Verwenden Sie den sleepBefehl.

Beispiel:

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.

Man kann auch Dezimalstellen verwenden, wenn man eine Zeiteinheit angibt; z.Bsleep 1.5s


12
Ich vergesse es immer sleep! ( pause,, waitoder delaywürde mehr Sinn machen und leichter zu merken sein.)
Geremia

47
Unter Mac OS X scheinen s, m, h und d keine Auswirkungen zu haben. Sie müssen die Zeit in Sekunden angeben.
Der KI-Architekt

6
Ich denke, die Benennung ist, weil wir thread.sleepFunktion in vielen Programmiersprachen haben @Geremia
Amin_mmz

89

Und was ist mit:

read -p "Press enter to continue"

35
Eigentlich hat dies meine Frage beantwortet , auch wenn es das OP nicht beantwortet.
Jesse Chisholm

9
Das hat nichts mit diesem Beitrag zu tun.
Murtadha S.

6
@murtadhaalsabbagh, hat aber sehr viel mit Google-Indizierung zu tun :) Hat mir übrigens auch geholfen.
Iulian Onofrei

read -p "
Drücken Sie die

@ JesseChisholm Ich denke, die Leute suchen nach dem Bash-Äquivalent der Powershell / cmdPAUSE
Rovyko

66

In Python (Frage wurde ursprünglich mit Python markiert) müssen Sie das Zeitmodul importieren

import time
time.sleep(1)

oder

from time import sleep
sleep(1)

Für Shell-Skript ist nur

sleep 1

Welches führt den sleepBefehl aus. z.B./bin/sleep


5
Ja, das sagt es auch, es ist nur das andere, das zuerst war, und es hat ein schönes Beispiel :) aber +1!

3
Obwohl dies nicht der richtige Weg ist, können Sie die Python-Antwort mit Bash kombinieren, indem Sie python -c "import time; time.sleep(1)"anstelle von sleep 1:)
Berry M.

2
@BerryM. - Dauert ungefähr 1,2 Sekunden, wenn ich es versuche. Python startet nicht sofort - das müssen Sie berücksichtigen. Mach es python -c "import time; time.sleep(0.8)"stattdessen. Aber dann müssen wir berücksichtigen, wie lange der Python-Start tatsächlich dauert. Sie müssen dies ausführen: um date +%N; python -c "import time; time.sleep(0)"; date +%Nzu bestimmen, wie viele Nanosekunden Python benötigt, um zu starten. Dazu gehört aber auch ein gewisser Overhead ab dem laufenden Datum. Führen Sie dies aus date +%N; date +%N, um den Overhead zu ermitteln. Pythons Overhead auf meinem Computer lag tatsächlich näher bei 0,14 Sekunden. Also ich will time.sleep(0.86).
ArtOfWarfare

Es stimmt , obwohl Sie nie genau 1000 ms bekommen werden, auch nicht so.
Berry M.

Typischerweise ist die Spezifikation mindestens die vorgegebene Zeitdauer, die normalerweise zum Zweck des Schlafes passt.
Marlin Pierce

40

Mir ist klar, dass ich damit etwas spät dran bin, aber Sie können auch den Schlaf anrufen und die gewünschte Zeit eingeben. Wenn ich beispielsweise 3 Sekunden warten möchte, kann ich Folgendes tun:

/bin/sleep 3

4 Sekunden würden so aussehen:

/bin/sleep 4

5
Ich bin nur darauf gestoßen, weil die am besten gewählte Antwort, @RyndallCooper 's, die fast ein Jahr zuvor verrückt war, -59x so viele Punkte hat und viel tiefer geht, und diese erscheint immer noch darüber, indem sie einfach jünger ist.
Aido

2
@AidanEdwards Es war auch für mich die beste Antwort, bis ich nach "Stimmen" sortiert habe (was ist die Standardeinstellung - ich frage mich, wie es auf "aktiv" gesetzt wurde?). Das Setzen auf "Stimmen" hat es jedoch behoben. Seltsam.
Christianbundy

1
@stackoverflow - ihr solltet ändern, wie das funktioniert ... bleibt immer an der Spitze!
Deian

3
"Es liegt daran, dass die am besten gewählte Antwort ... immer noch darüber erscheint, nur weil sie jünger ist" - ähhh, nein, man sollte NIEMALS eine Antwort aus solch leichtfertigen Gründen ablehnen, die nicht mit schlechten Inhalten in dieser Antwort zusammenhängen.
Nicholas Petersen

35

Unter Mac OS X dauert der Ruhezustand nicht Minuten / usw., sondern nur Sekunden. Also für zwei Minuten,

sleep 120

27

Führen Sie mehrere Sleeps und Befehle aus

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

Dies wird 5 Sekunden warten, bevor das erste Skript ausgeführt wird, und dann 3 Sekunden lang wieder in den Ruhezustand versetzt werden, bevor das Verzeichnis erneut geändert wird.


4
+1 ... denn wenn Sie nach dem Schlaf ein kaufmännisches Und verwenden, sendet es den Schlaf an seinen eigenen Thread und startet sofort die nächste Aktion (dh der Schlaf verzögert die nächste Aktion nicht)
Jay Marm

18

Innerhalb des Skripts können Sie zwischen den Aktionen, für die Sie die Pause wünschen, Folgendes hinzufügen. Dadurch wird die Routine für 5 Sekunden angehalten.

read -p "Pause Time 5 seconds" -t 5
read -p "Continuing in 5 Seconds...." -t 5
echo "Continuing ...."

Das wird nicht wirklich funktionieren, oder? Ich denke, das -t 5wird das Skript nach 5 Sekunden abbrechen, nicht weiter, zumindest laut dieser Manpage zum Lesen
Brad Parks

@BradParks Ja, es wird funktionieren Nur für den Fall: root @ Joses-iPad: ~ # cat readtest.bash #! / Bin / bash echo "Hier" read -p "Pausenzeit 5 Sekunden" -t 5 read -p "Weiter in 5 Sekunden .... "-t 5 Echo" Fortsetzung .... "Echo" Dort "root @ Joses-iPad: ~ # cat re./st.bash Hier Pause Zeit 5 Sekunden Fortsetzung in 5 Sekunden .... Fortsetzung .... dort
Jose H. Rosa

Hmmm ... ich denke du hast recht! Ich dachte, ich hätte es versucht, aber ich habe es einfach noch einmal versucht und es funktioniert wie angekündigt. Vielen Dank!
Brad Parks

5

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

Fahren Sie fort, wenn Sie eine beliebige Taste drücken


7
Während dieses Code-Snippet die Lösung sein kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Friedenstyp

1
Diese Antwort ist ein Nur-Code-Kommentar. Es wird nicht versucht, den angegebenen Code zu erklären. Ich habe das Gefühl, dass das Poster die Frage falsch interpretiert hat als "Wie warte ich auf Benutzereingaben, während ich gleichzeitig eine Zeitüberschreitung für diese Benutzereingaben habe"
Zimano

2

Sie können es mit $ RANDOM, einem Standard-Zufallszahlengenerator, warten lassen. Im Folgenden verwende ich 240 Sekunden. Ich hoffe, das hilft @

> WAIT_FOR_SECONDS=`/usr/bin/expr $RANDOM % 240` /bin/sleep
> $WAIT_FOR_SECONDS

1

Verwenden Sie Trap, um die Befehlszeile anzuhalten und zu überprüfen, bevor Sie sie ausführen

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

Drücken Sie eine beliebige Taste, um fortzufahren

Verwenden Sie set -xdiese Option, um die Befehlszeile zu debuggen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.