GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je dormir une milliseconde en bash ou en ksh

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

Linux
  1. Comment déboguer un script bash ?

  2. Comment obtenir l'achèvement de Bash pour les alias de commande ?

  3. Comment spécifier une saisie semi-automatique personnalisée pour des commandes spécifiques ?

  4. Comment créer un environnement Shell propre pour une utilisation temporaire ?

  5. Comment désactiver un alias dans Bash pour une seule commande ? ?

Comment écrire une boucle dans Bash

Comment commenter dans Bash

Bash pour la boucle

Comment utiliser bash if -z et if -n pour tester des chaînes sous Linux

Shell Scripting pour les débutants - Comment écrire des scripts Bash sous Linux

Comment exécuter un script bash