Potrzebowałem licznika czasu, który rozpocznie się na samym początku skryptu, a zakończy na końcu.
time yourprogram.sh
:, że @Marius Cotofana wyjaśnił
Potrzebowałem licznika czasu, który rozpocznie się na samym początku skryptu, a zakończy na końcu.
time yourprogram.sh
:, że @Marius Cotofana wyjaśnił
Odpowiedzi:
Jeśli chcesz czas trwania w sekundach, na najwyższym poziomie
start=$SECONDS
i na koniec
duration=$(( SECONDS - start ))
Możesz użyć wbudowanego time
polecenia Linuksa . Ze strony podręcznika:
czas POLECENIE [argumenty]
czas określa, które informacje mają być wyświetlane o zasobach używanych przez polecenie, z ciągu FORMAT. Jeśli w wierszu komend nie podano żadnego formatu, ale ustawiona jest zmienna środowiskowa TIME, jej wartość jest używana jako format.
Aby zmierzyć czas cleanup.sh
skryptu, użyj:
$ time cleanup.sh
time
którego używasz. hackernoon.com/…
Zdaję sobie sprawę, że jest to dość stare pytanie, ale w ten sposób robię to dla wszystkiego, kiedy chcę / muszę wiedzieć, ile czasu zajęło uruchomienie.
Bash ma wbudowany licznik sekund w postaci wewnętrznej zmiennej o nazwie SECONDS
(patrz: tutaj dla innych zmiennych wewnętrznych)
Umieść SECONDS=0
przed tym, co sprawdzasz, czas działania. Aby uzyskać dobry wynik, musi nastąpić po każdym wprowadzeniu przez użytkownika, więc jeśli monitujesz o informacje, umieść je po znaku zachęty.
Następnie umieść to na końcu tego, co sprawdzasz:
if (( $SECONDS > 3600 )) ; then
let "hours=SECONDS/3600"
let "minutes=(SECONDS%3600)/60"
let "seconds=(SECONDS%3600)%60"
echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)"
elif (( $SECONDS > 60 )) ; then
let "minutes=(SECONDS%3600)/60"
let "seconds=(SECONDS%3600)%60"
echo "Completed in $minutes minute(s) and $seconds second(s)"
else
echo "Completed in $SECONDS seconds"
fi
Jeśli chcesz poznać czas w sekundach, możesz uprościć powyższe, aby:
echo "Completed in $SECONDS seconds"
Jako przykład:
read -rp "What's your name? " "name"
SECONDS=0
echo "Hello, $name"
if (( $SECONDS > 3600 )) ; then
let "hours=SECONDS/3600"
let "minutes=(SECONDS%3600)/60"
let "seconds=(SECONDS%3600)%60"
echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)"
elif (( $SECONDS > 60 )) ; then
let "minutes=(SECONDS%3600)/60"
let "seconds=(SECONDS%3600)%60"
echo "Completed in $minutes minute(s) and $seconds second(s)"
else
echo "Completed in $SECONDS seconds"
fi
date +%T -d "1/1 + $SECONDS sec"
(ograniczony do mniej niż 24 godzin, ale możesz również dostosować, aby dodać dni)
#!/bin/bash
start=$(date +%s)
#
# do something
sleep 10
#
#
end=$(date +%s)
seconds=$(echo "$end - $start" | bc)
echo $seconds' sec'
echo 'Formatted:'
awk -v t=$seconds 'BEGIN{t=int(t*1000); printf "%d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'
@ anask zrobić sprytne rozwiązanie dla tej odpowiedzi, po prostu polecam użyć natywnego $SECONDS
zamiast tego, aby utworzyć nowe
awk -v t=$SECONDS 'BEGIN{t=int(t*1000); printf "Elapsed Time (HH:MM:SS): %d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'
Celem podziału printf
i podziału jest przeliczenie upływających sekund na odpowiadające im godziny, minuty, sekundy, odpowiednio.
time
komendy użycia czasu pracy skryptu (czas ./script.sh), do wydrukowaniadate
komendy użycia czasu pracy itd.