Solution 1 :
La documentation du sleep
commande de coreutils dit :
Les implémentations historiques de sleep ont exigé que le nombre soit un entier et n'acceptaient qu'un seul argument sans suffixe. Cependant, GNU sleep accepte des nombres à virgule flottante arbitraires. Voir Virgule flottante.
Vous pouvez donc utiliser sleep 0.1
, sleep 1.0e-1
et arguments similaires.
Solution 2 :
Bash a une veille "chargeable" qui prend en charge les fractions de seconde et élimine les frais généraux d'une commande externe :
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
Ensuite :
$ 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
L'inconvénient est que les chargeables peuvent ne pas être fournis avec votre bash
binaire, vous devrez donc les compiler vous-même comme indiqué (bien que sur Solaris, ce ne serait pas nécessairement aussi simple que ci-dessus).
Depuis bash-4.4
(Septembre 2016) tous les chargeables sont maintenant construits et installés par défaut sur les plates-formes qui le prennent en charge, bien qu'ils soient construits en tant que fichiers d'objets partagés séparés, et sans .so
suffixe. Sauf si votre distribution/OS a fait quelque chose de créatif (malheureusement RHEL/CentOS 8 build bash-4.4
avec des extensions chargeables délibérément supprimé), vous devriez pouvoir faire à la place :
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(La page de manuel implique BASH_LOADABLES_PATH
est défini automatiquement, je trouve que ce n'est pas le cas dans la distribution officielle à partir de 4.4.12. Si et quand il est correctement défini, vous n'avez besoin que de enable -f filename commandname
selon les besoins.)
Si cela ne convient pas, la prochaine chose la plus simple à faire est de construire ou d'obtenir sleep
à partir de GNU coreutils, cela prend en charge la fonctionnalité requise. Le POSIX sleep
La commande est minime, les anciennes versions de Solaris n'implémentaient que cela. Solaris11 sleep
fait prend en charge les fractions de seconde.
En dernier recours, vous pouvez utiliser perl
(ou tout autre script que vous avez sous la main) avec la mise en garde que l'initialisation de l'interpréteur peut être comparable au temps de veille prévu :
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh
Solution 3 :
Sleep accepte les nombres décimaux, vous pouvez donc les décomposer comme suit :
1/2 de seconde
sleep 0.5
1/100 de seconde
sleep 0.01
Donc, pendant une milliseconde, vous voudriez
sleep 0.001
Solution 4 :
Essayez ceci pour déterminer la précision :
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)
Combinaison de la solution de mr.spuratic et de la solution de coles.
Solution 5 :
Vous pouvez simplement utiliser usleep
. Cela prend des microsecondes (=1e-6 secondes) comme paramètre, donc pour dormir 1 milliseconde, vous entreriez :
usleep 1000