GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie schlafe ich für eine Millisekunde in bash oder ksh

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

Linux
  1. So verwenden Sie Bash-Verlaufsbefehle

  2. Wie schreibe ich eine Schleife in Bash?

  3. Wie debuggt man ein Bash-Skript?

  4. Wie erhalte ich die Bash-Vervollständigung für Befehlsaliase?

  5. Wie ändere ich das Verzeichnis in Git Bash mit Git für Windows?

So kommentieren Sie in Bash

Bash für Schleife

So verwenden Sie bash if -z und if -n zum Testen von Zeichenfolgen in Linux

Shell-Scripting für Anfänger – So schreiben Sie Bash-Scripts unter Linux

So führen Sie ein Bash-Skript aus

Wie man in einem Bash-Skript nach Unicode sucht