O Bash tem um sono "carregável" que suporta segundos fracionários e elimina as despesas gerais de um comando externo:
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
Então:
$ 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
A desvantagem é que os carregáveis podem não ser fornecidos com o seu bash
binário, portanto você precisará compilá-los como mostrado (embora no Solaris não seja necessariamente tão simples como acima).
A partir debash-4.4
(setembro de 2016), todos os carregáveis agora são construídos e instalados por padrão nas plataformas que o suportam, embora sejam construídos como arquivos de objetos compartilhados separados e sem .so
sufixo. A menos que sua distribuição / SO tenha feito algo criativo, você poderá fazer:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(A página de manual implica que ela BASH_LOADABLES_PATH
seja configurada automaticamente, acho que esse não é o caso na distribuição oficial a partir de 4.4.12. Se e quando estiver configurada corretamente, você precisará apenas enable -f filename commandname
conforme necessário.)
Se isso não for adequado, a próxima coisa mais fácil a fazer é criar ou obter sleep
do GNU coreutils, isso suporta o recurso necessário. O sleep
comando POSIX é mínimo, versões mais antigas do Solaris implementadas apenas isso. Solaris 11 sleep
faz apoiar segundos fracionários.
Como último recurso, você pode usar perl
(ou qualquer outro script que tenha em mãos) com a ressalva de que a inicialização do intérprete pode ser comparável ao tempo de sono pretendido:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh