Bash a un sommeil "chargeable" qui prend en charge une fraction 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 éléments chargeables ne peuvent pas être fournis avec votre bash
fichier binaire, vous devez donc les compiler vous-même, comme indiqué (bien que sous Solaris, ce ne soit pas nécessairement aussi simple que ci-dessus).
Depuisbash-4.4
septembre 2016, tous les objets chargeables sont désormais construits et installés par défaut sur les plates-formes qui le prennent en charge, bien qu'ils soient générés sous la forme de fichiers à objets partagés séparés et sans .so
suffixe. À moins que votre distribution / votre système d’exploitation n’ait fait quelque chose de créatif, vous devriez pouvoir le faire:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(La page de manuel implique que le BASH_LOADABLES_PATH
réglage est automatique, je constate que ce n'est pas le cas dans la distribution officielle à partir de la version 4.4.12. Si et quand il est correctement défini, vous n'aurez besoin que de la enable -f filename commandname
manière requise.)
Si cela ne convient pas, la prochaine chose à faire est de créer ou d’obtenir sleep
GNU coreutils, ceci prend en charge la fonctionnalité requise. La sleep
commande POSIX est minimale, les anciennes versions de Solaris ne l'implémentant que. Solaris 11 sleep
prend en charge les secondes fractionnelles.
En dernier recours, vous pouvez utiliser perl
(ou tout autre script que vous avez sous la main) en précisant que l'initialisation de l'interpréteur peut être comparable au temps de sommeil souhaité:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh