Soluzione 1:
La documentazione per sleep
comando da coreutils dice:
Le implementazioni storiche di sleep richiedevano che il numero fosse un numero intero e accettavano solo un singolo argomento senza suffisso. Tuttavia, sleep GNU accetta numeri in virgola mobile arbitrari. Vedi Virgola mobile.
Quindi puoi usare sleep 0.1
, sleep 1.0e-1
e argomenti simili.
Soluzione 2:
Bash ha uno sleep "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
Quindi:
$ 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 caricabili potrebbero non essere forniti con il tuo bash
binario, quindi dovresti compilarli tu stesso come mostrato (sebbene su Solaris non sarebbe necessariamente semplice come sopra).
A partire dal bash-4.4
(settembre 2016) tutti i caricabili sono ora creati e installati per impostazione predefinita su piattaforme che lo supportano, sebbene siano creati come file di oggetti condivisi separati e senza un .so
suffisso. A meno che la tua distribuzione/OS non abbia fatto qualcosa di creativo (purtroppo RHEL/CentOS 8 build bash-4.4
con estensioni caricabili deliberatamente rimosso), dovresti essere in grado di fare invece:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(La pagina man implica BASH_LOADABLES_PATH
è impostato automaticamente, trovo che non sia così nella distribuzione ufficiale a partire dalla 4.4.12. Se e quando è impostato correttamente ti serve solo enable -f filename commandname
come richiesto.)
Se ciò non è adatto, la prossima cosa più semplice da fare è compilare o ottenere sleep
da GNU coreutils, questo supporta la funzionalità richiesta. Il POSIX sleep
il comando è minimo, le versioni precedenti di Solaris implementavano solo quello. Solaris 11 sleep
fa supporta i secondi frazionari.
Come ultima risorsa puoi usare perl
(o qualsiasi altro scripting che hai a portata di mano) con l'avvertenza che l'inizializzazione dell'interprete potrebbe essere paragonabile al tempo di sospensione previsto:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh
Soluzione 3:
Sleep accetta numeri decimali, quindi puoi suddividerli in questo modo:
1/2 di secondo
sleep 0.5
1/100 di secondo
sleep 0.01
Quindi per un millisecondo vorresti
sleep 0.001
Soluzione 4:
Prova questo per determinare la precisione:
time sleep 0.5 # 500 milliseconds (1/2 of a second)
time sleep 0.001 # 1 millisecond (1/1000 of a second)
time sleep 1.0 # 1 second (1000 milliseconds)
Combinazione della soluzione di mr.spuratic e della soluzione di coles.
Soluzione 5:
Puoi semplicemente usare usleep
. Ci vogliono microsecondi (=1e-6 secondi) come parametro, quindi per dormire 1 millisecondo devi inserire:
usleep 1000