Bash verfügt über einen "ladbaren" Ruhezustand, der Sekundenbruchteile 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 Ihrer bash
Binärdatei geliefert werden. Sie müssten sie daher wie gezeigt selbst kompilieren (unter Solaris ist dies jedoch nicht unbedingt so einfach wie oben beschrieben).
Abbash-4.4
(September 2016) werden alle Loadables standardmäßig auf Plattformen erstellt und installiert, die dies unterstützen. Sie werden jedoch als separate Shared Object-Dateien ohne .so
Suffix erstellt. Sofern Ihre Distribution / Ihr Betriebssystem nichts Kreatives geleistet hat, 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
, dass sie automatisch gesetzt wird. Ich finde, dass dies in der offiziellen Distribution ab 4.4.12 nicht der Fall ist. Wenn und wann sie richtig gesetzt ist, brauchen Sie nur enable -f filename commandname
die erforderlichen Einstellungen .)
Wenn dies nicht geeignet ist, ist es am einfachsten, sleep
GNU-Coreutils zu erstellen oder von diesen zu beziehen. Dies unterstützt die erforderliche Funktion. Der POSIX- sleep
Befehl ist minimal, ältere Solaris-Versionen haben nur diesen implementiert. Solaris 11 sleep
tut Sekundenbruchteile unterstützen.
Als letzten Ausweg können Sie perl
(oder jedes andere Skript, das Sie zur Hand haben) mit der Einschränkung verwenden, dass das Initialisieren des Interpreters möglicherweise mit der beabsichtigten Ruhezeit vergleichbar ist:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh