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
(Подразумевается, что страница man 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