Spawnowanie procesu i ładowanie nowego pliku wykonywalnego może potrwać kilka milisekund, więc taka precyzja nie ma sensu. Należy również pamiętać, że czas procesora w wielu systemach jest alokowany do procesów w odstępach do 10 ms.
To powiedziawszy, niektóre sleep
implementacje zajmują ułamkowe liczby sekund, a zarówno zsh, jak i ksh93 mogą tworzyć swoją $SECONDS
specjalną zmienną ułamkową typeset -F SECONDS
.
Przykład (zsh):
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((1./70)); date +%s.%N; done | { head -n3;echo ..;tail -n3; }; echo $SECONDS
1350076317.374870501
1350076317.391034397
1350076317.407278461
..
1350076318.464585550
1350076318.480887660
1350076318.497133050
1.1393780000
Ups, dryfował. Możesz dostosować czas snu na podstawie $SECONDS
:
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((i/70. - SECONDS)); date +%s.%N; done | { head -n3;echo ...;tail -n3; }; echo $SECONDS
1350076420.262775654
1350076420.277012997
1350076420.291302750
../..
1350076421.219682227
1350076421.234134663
1350076421.248255685
1.0020580000
Te 2 dodatkowe milisekundy należy prawdopodobnie uwzględnić przy uruchamianiu ostatniego polecenia sleep
i date
poleceń.
Zauważ też, że zsh ma zselect
wbudowany limit czasu wyrażony w setnych sekundach. A ksh93 ma sleep
wbudowane (i akceptuje zmiennoprzecinkowe) i printf
może drukować datę / godzinę.
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do ((i<4 || i>67)) && printf '%(%S.%N)T\n' now; sleep $((i/70.-SECONDS)); done; echo $SECONDS
20.823349000
20.837510000
20.851663000
21.780099000
21.794254000
21.808405000
0.9992358685
Jeśli chcesz czegoś bardziej precyzyjnego, prawdopodobnie będziesz chciał systemu operacyjnego w czasie rzeczywistym lub systemu operacyjnego z funkcjami w czasie rzeczywistym i na pewno nie użyje powłoki.