GNU/Linux >> Linux Esercitazione >  >> Linux

Come dormo per un millisecondo in bash o ksh

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

Linux
  1. Come eseguire il debug di uno script Bash?

  2. Come ottenere il completamento di Bash per gli alias di comando?

  3. Come creare un ambiente Shell pulito per uso temporaneo?

  4. Come disabilitare un alias in Bash per un singolo comando??

  5. Come rilevare Bash>=4.0?

Come scrivere un ciclo in Bash

Come commentare in Bash

Bash For Loop

Come usare bash if -z e if -n per testare le stringhe in Linux

Script di shell per principianti - Come scrivere script Bash in Linux

Come eseguire uno script Bash