Lösung 1:
Die Dokumentation für sleep
Befehl von coreutils sagt:
Historische Implementierungen von sleep haben verlangt, dass diese Zahl eine ganze Zahl ist, und akzeptierten nur ein einzelnes Argument ohne Suffix. GNU sleep akzeptiert jedoch beliebige Fließkommazahlen. Siehe Fließkomma.
Daher können Sie sleep 0.1
verwenden , sleep 1.0e-1
und ähnliche Argumente.
Lösung 2:
Bash hat einen "ladbaren" Ruhezustand, der Bruchteile von Sekunden unterstützt und den Overhead eines externen Befehls eliminiert:
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
Dann:
$ which sleep
/usr/bin/sleep
$ builtin sleep
sleep: usage: sleep seconds[.fraction]
$ time (for f in `seq 1 10`; do builtin sleep 0.1; done)
real 0m1.000s
user 0m0.004s
sys 0m0.004s
Der Nachteil ist, dass die Loadables möglicherweise nicht mit Ihrem bash
bereitgestellt werden binär, also müssten Sie sie wie gezeigt selbst kompilieren (obwohl es unter Solaris nicht unbedingt so einfach wie oben wäre).
Ab bash-4.4
(September 2016) werden jetzt alle Loadables standardmäßig auf Plattformen erstellt und installiert, die dies unterstützen, obwohl sie als separate Shared-Object-Dateien und ohne .so
erstellt werden Suffix. Es sei denn, Ihre Distribution/Ihr Betriebssystem hat etwas Kreatives getan (leider RHEL/CentOS 8 build bash-4.4
mit ladbaren Erweiterungen bewusst entfernt), sollten Sie stattdessen Folgendes tun können:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(Die Manpage impliziert BASH_LOADABLES_PATH
automatisch gesetzt wird, finde ich, dass dies in der offiziellen Distribution ab 4.4.12 nicht der Fall ist. Wenn und wenn es richtig eingestellt ist, brauchen Sie nur enable -f filename commandname
nach Bedarf.)
Wenn das nicht passt, ist die nächste einfachste Sache, sleep
zu bauen oder zu erhalten von GNU Coreutils unterstützt dies die erforderliche Funktion. Der POSIX sleep
Der Befehl ist minimal, ältere Solaris-Versionen haben nur diesen implementiert. Solaris 11 sleep
macht Sekundenbruchteile unterstützen.
Als letzten Ausweg könnten Sie perl
verwenden (oder jedes andere Skript, das Sie zur Hand haben) mit der Einschränkung, dass die Initialisierung des Interpreters mit der beabsichtigten Ruhezeit vergleichbar sein kann:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh
Lösung 3:
Sleep akzeptiert Dezimalzahlen, sodass Sie es folgendermaßen aufschlüsseln können:
1/2 Sekunde
sleep 0.5
1/100 Sekunde
sleep 0.01
Also für eine Millisekunde würden Sie wollen
sleep 0.001
Lösung 4:
Versuchen Sie Folgendes, um die Genauigkeit zu bestimmen:
time sleep 0.5 # 500 milliseconds (1/2 of a second)
time sleep 0.001 # 1 millisecond (1/1000 of a second)
time sleep 1.0 # 1 second (1000 milliseconds)
Kombination der Lösung von Mr. Spuratic und der Lösung von Coles.
Lösung 5:
Sie können einfach usleep
verwenden . Es braucht Mikrosekunden (=1e-6 Sekunden) als Parameter, um also 1 Millisekunde zu schlafen, würden Sie Folgendes eingeben:
usleep 1000