Bash має "завантажуваний" сон, який підтримує дробові секунди і виключає накладні витрати зовнішньої команди:
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
Тоді:
$ 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
Мінус полягає в тому, що завантажувальні файли можуть не надаватися у вашому bash
бінарному файлі, тому вам потрібно буде скласти їх самостійно, як показано (хоча для Solaris це не обов'язково буде таким простим, як вище).
Станом наbash-4.4
(вересень 2016 р.) Усі завантажені файли тепер будуються та встановлюються за замовчуванням на платформах, які підтримують його, хоча вони побудовані як окремі файли спільного об’єкта та без .so
суфікса. Якщо ваш дистрибутив / ОС не зробили щось креативне, вам слід зробити це:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(Сторінка підручника передбачає BASH_LOADABLES_PATH
, що встановлюється автоматично, я вважаю, що це не так в офіційному розповсюдженні станом на 4.4.12. Якщо і коли він встановлений правильно, вам потрібно лише enable -f filename commandname
в міру необхідності.)
Якщо це не підходить, наступне найпростіше зробити - це створити або отримати sleep
з GNU coreutils, це підтримує необхідну функцію. Команда POSIX sleep
мінімальна, старіші версії Solaris реалізовані лише для цього. Solaris 11 sleep
робить підтримку дрібних секунд.
В крайньому випадку ви можете використовувати perl
(або будь-який інший сценарій, який вам потрібно вручити) із застереженням, яке ініціалізація перекладача може бути порівнянним із запланованим часом сну:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh