Bash ha una sospensione "caricabile" che supporta i secondi frazionari ed elimina le spese generali di un comando esterno:
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
Poi:
$ 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
Lo svantaggio è che i file caricabili potrebbero non essere forniti con il file bash
binario, quindi è necessario compilarli come mostrato (anche se su Solaris non sarebbe necessariamente semplice come sopra).
A partire dabash-4.4
(settembre 2016) tutti i caricabili sono ora costruiti e installati per impostazione predefinita su piattaforme che lo supportano, sebbene siano costruiti come file di oggetti condivisi separati e senza .so
suffisso. A meno che la tua distribuzione / OS non abbia fatto qualcosa di creativo, dovresti invece essere in grado di fare:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(La pagina man implica che BASH_LOADABLES_PATH
è impostata automaticamente, trovo che questo non sia il caso nella distribuzione ufficiale a partire dal 4.4.12. Se e quando è impostato correttamente, è necessario solo enable -f filename commandname
come richiesto.)
Se ciò non è adatto, la prossima cosa più semplice da fare è costruire o ottenere sleep
dai coreutils GNU, questo supporta la funzionalità richiesta. Il sleep
comando POSIX è minimo, le versioni precedenti di Solaris hanno implementato solo questo. Solaris 11 sleep
fa sostenere frazioni di secondo.
Come ultima risorsa potresti usare perl
(o qualsiasi altro script che devi tenere a portata di mano) con l'avvertenza che l'inizializzazione dell'interprete potrebbe essere paragonabile al tempo di sonno previsto:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh