Ř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