Bash tiene una suspensión "cargable" que admite segundos fraccionarios y elimina los gastos generales de un comando externo:
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
Entonces:
$ 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
La desventaja es que es posible que los archivos cargables no se proporcionen con su bash
binario, por lo que necesitaría compilarlos usted mismo como se muestra (aunque en Solaris no sería necesariamente tan simple como arriba).
A partir debash-4.4
(septiembre de 2016), todas las herramientas cargables ahora están compiladas e instaladas de forma predeterminada en plataformas que lo admiten, aunque están compiladas como archivos de objetos compartidos separados y sin .so
sufijo. A menos que su distribución / sistema operativo haya hecho algo creativo, debería poder hacer lo siguiente:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(La página del manual implica que BASH_LOADABLES_PATH
se configura automáticamente, creo que este no es el caso en la distribución oficial a partir de 4.4.12. Si se configura correctamente y solo enable -f filename commandname
cuando sea necesario).
Si eso no es adecuado, lo siguiente más fácil de hacer es construir u obtener sleep
de coreutils de GNU, esto es compatible con la función requerida. El sleep
comando POSIX es mínimo, las versiones anteriores de Solaris implementaron solo eso. Solaris 11 sleep
hace apoyar fracciones de segundo.
Como último recurso, puede usar perl
(o cualquier otra secuencia de comandos que tenga a mano) con la advertencia de que la inicialización del intérprete puede ser comparable al tiempo de sueño previsto:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh