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, então você precisaria compilá-los como mostrado (embora no Solaris isso não seja necessariamente tão simples quanto acima).
A partir de bash-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 criados como arquivos separados de objetos compartilhados e sem% sufixo.so
. A menos que sua distribuição / sistema operacional tenha feito algo criativo, você deve poder fazer isso:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(A página man implica BASH_LOADABLES_PATH
é definida automaticamente, acho que este não é o caso na distribuição oficial a partir de 4.4.12. Se e quando estiver configurado corretamente, você precisará apenas de 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 comando POSIX sleep
é mínima versões mais antigas, o Solaris só isso implementadas. Solaris 11 sleep
faz suporte fracionário segundos.
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