Chciałbym w pewnym momencie wykonać następujące czynności w skrypcie:
start_time=date 
i to po uruchomieniu procesu lub procesów:
end_time=date 
a następnie zrób to:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process" 
Jak mam to zrobić?
Komentarze
-  
/usr/bin/time your_script… - Powiązane: stackoverflow.com/q/8903239/6843677
 
Odpowiedź
Wykorzystaj czas, jaki upłynął od epoki, aby łatwo zidentyfikować przedział czasu w skrypcie
man date %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999) 
.
start_time="$(date -u +%s)" sleep 5 end_time="$(date -u +%s)" elapsed="$(($end_time-$start_time))" echo "Total of $elapsed seconds elapsed for process" Total of 5 seconds elapsed for process 
 Bash nie obsługuje liczb zmiennoprzecinkowych, więc będziesz musiał użyć zewnętrznego narzędzia, takiego jak bc, aby porównać czasy, takie jak 1475705058.042270582-1475705053.040524971 
start_time="$(date -u +%s.%N)" sleep 5 end_time="$(date -u +%s.%N)" elapsed="$(bc <<<"$end_time-$start_time")" echo "Total of $elapsed seconds elapsed for process" Total of 5.001884264 seconds elapsed for process 
Komentarze
Odpowiedź
bash ma wbudowana zmienna timera
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete" 
Komentarze
- Lub . Uważaj jednak na ten błąd .
 
Odpowiedź
@jasonwryan już to zasugerował, ale wrzucę to jako odpowiedź, ponieważ jest to również mój punkt wyjścia, gdy chcę określić czas skryptu. Aby określić czas mój skrypt , po prostu użyj:
time myscript 
Komentarze
- Spróbuję tego od czasu do czasu, ale jest to bardziej przydatne, gdy muszę izolacja lub podsekcja czasu mojego skryptu ..
 - Nie jest to przydatne, jeśli chcesz użyć wyprowadzonego czasu, który upłynął w samym skrypcie, np. aby obliczyć, ile jednostek skrypt był w stanie przetworzyć na sekundę .
 
Odpowiedź
 Podoba mi się odpowiedź @Miata „, ponieważ zwraca uwagę na date +%s rozwiązanie. Jednak @Miata zawiera .%N, ale nie jestem pewien, jaką korzyść odniesiesz, patrząc na nanosekundy, gdy występuje koszt wykonania date polecenie w podpowłoce. Dlatego w praktyce date +%s powinno wystarczyć. Inną rzeczą, na którą należy zwrócić uwagę, jest date +%s epoka to 1970-01-01 00:00:00 UTC. Co oznacza, że czas ma absolutną epokę i możesz dzielić pomiar czasu między różnymi instancjami skryptu powłoki lub różnymi maszynami. 
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24 
 Lubię @glenn jackman ” odpowiedź, ponieważ odnosi się do wbudowanej zmiennej bash SECONDS. Należy tu zwrócić uwagę na to, że epoka to czas rozpoczęcia procesu. Możemy więc użyć tej techniki tylko do mierzyć czas dla rzeczy, które dzieją się w tym skrypcie: 
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24 
 Inną rzeczą jest to, że umieszczam wszystkie moje zadania w (( )) polecenie. tzn. możesz przepisać: 
cmd=$(( some_expression )) 
jako
(( cmd=some_expression )) 
 Robiąc to , możemy zminimalizować występowanie symbolu $. 
date '+%s.%N'date -u, aby uniknąć czasu letniego i lokalnych problemów z poleceniem. Proszę przeczytaj tę odpowiedźelapsed=$(dc -e "$end_time $start_time - p")