Bash ma „ładowany” sen, który obsługuje ułamkowe sekundy i eliminuje koszty zewnętrzne polecenia:
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
Następnie:
$ 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
Minusem jest to, że pliki ładowalne mogą nie być dostarczane z Twoim bashplikiem binarnym, więc musisz sam je skompilować, jak pokazano (chociaż w Solarisie nie musi to być tak proste, jak powyżej).
Odbash-4.4 (wrzesień 2016 r.) Wszystkie programy ładujące są teraz budowane i instalowane domyślnie na platformach, które je obsługują, chociaż są one budowane jako osobne pliki obiektów współużytkowanych i bez .soprzyrostka. O ile Twój system / system operacyjny nie zrobił czegoś kreatywnego, powinieneś być w stanie to zrobić:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(Strona BASH_LOADABLES_PATHpodręcznika sugeruje, że jest ustawiana automatycznie, uważam, że nie jest tak w oficjalnej dystrybucji od 4.4.12. Jeśli i kiedy jest ustawiona poprawnie, potrzebujesz tylko enable -f filename commandnamezgodnie z wymaganiami.)
Jeśli to nie jest odpowiednie, następną najłatwiejszą rzeczą jest zbudowanie lub uzyskanie sleepz GNU coreutils, obsługuje to wymaganą funkcję. Polecenie POSIX sleepjest minimalne, starsze wersje systemu Solaris zaimplementowały tylko to. Solaris 11 sleep nie obsługują ułamków sekund.
W ostateczności możesz użyć perl(lub dowolnego innego skryptu, który masz pod ręką) z zastrzeżeniem, że inicjowanie interpretera może być porównywalne z zamierzonym czasem snu:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh