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 bash
plikiem 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 .so
przyrostka. 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_PATH
podrę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 commandname
zgodnie z wymaganiami.)
Jeśli to nie jest odpowiednie, następną najłatwiejszą rzeczą jest zbudowanie lub uzyskanie sleep
z GNU coreutils, obsługuje to wymaganą funkcję. Polecenie POSIX sleep
jest 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