GNU/Linux >> Znalost Linux >  >> Linux

Jak usnu na milisekundu v bash nebo ksh

Řešení 1:

Dokumentace pro sleep příkaz z coreutils říká:

Historické implementace spánku vyžadovaly, aby číslo bylo celé číslo a akceptovalo pouze jeden argument bez přípony. Nicméně GNU sleep přijímá libovolná čísla s pohyblivou řádovou čárkou. Viz Plovoucí desetinná čárka.

Můžete tedy použít sleep 0.1 , sleep 1.0e-1 a podobné argumenty.

Řešení 2:

Bash má „načítatelný“ režim spánku, který podporuje zlomkové sekundy a eliminuje režii externího příkazu:

$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep

Potom:

$ 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

Nevýhodou je, že zatížitelné položky nemusí být součástí vašeho bash binární, takže je budete muset zkompilovat sami, jak je znázorněno (ačkoli na Solarisu by to nemuselo být tak jednoduché jako výše).

Ke dni bash-4.4 (září 2016) všechny načítatelné položky jsou nyní ve výchozím nastavení sestaveny a nainstalovány na platformách, které to podporují, ačkoli jsou sestaveny jako samostatné soubory sdílených objektů a bez .so přípona. Pokud vaše distro/OS neudělal něco kreativního (bohužel RHEL/CentOS 8 build bash-4.4 s načítatelnými rozšířeními úmyslně odstraněn), měli byste být schopni provést:

[ -z "$BASH_LOADABLES_PATH" ] &&
  BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)  
enable -f sleep sleep

(Manuální stránka obsahuje BASH_LOADABLES_PATH se nastavuje automaticky, v oficiální distribuci od 4.4.12 to tak není. Pokud a když je nastaven správně, potřebujete pouze enable -f filename commandname podle potřeby.)

Pokud to není vhodné, další nejjednodušší věcí je sestavit nebo získat sleep z GNU coreutils, to podporuje požadovanou funkci. POSIX sleep příkaz je minimální, starší verze Solarisu implementovaly pouze to. Solaris 11 sleep dělá podporovat zlomky sekund.

Jako poslední možnost můžete použít perl (nebo jakýkoli jiný skript, který musíte mít k dispozici) s upozorněním, že inicializace interpretu může být srovnatelná se zamýšlenou dobou spánku:

$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh

Řešení 3:

Spánek přijímá desetinná čísla, takže je můžete rozdělit takto:

1/2 sekundy

 sleep 0.5

1/100 sekundy

sleep 0.01

Takže na milisekundu, kterou byste chtěli

sleep 0.001

Řešení 4:

Chcete-li určit přesnost, zkuste toto:

    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)

Kombinace roztoku pana spuratica a colesova roztoku.

Řešení 5:

Můžete jednoduše použít usleep . Jako parametr to trvá mikrosekundy (=1e-6 sekund), takže do spánku 1 milisekundu byste zadali:

usleep 1000

Linux
  1. Jak napsat smyčku v Bash

  2. Jak získat dokončování bash pro aliasy příkazů?

  3. Jak zakázat alias v Bash pro jeden příkaz?

  1. Jak používat příkazy historie Bash

  2. Jak změním adresář v Git Bash pomocí Git pro Windows?

  3. Jak změnit rozlišení Bash pro Debian VM?

  1. Jak ladit Bash skript?

  2. Jak určit vlastní automatické doplňování pro konkrétní příkazy?

  3. Jak vytvořit prostředí Clean Shell pro dočasné použití?