Jak używać timera w bash?

Potrzebowałem licznika czasu, który będzie zaczynał się na samym początku skryptu i zatrzymywał na końcu.

Komentarze

  • napisz cel, który chcesz osiągnąć. do pomiaru czasu pracy skryptu użyj polecenia time (time ./script.sh), do wydrukowania aktualnego czasu użyj polecenia date i tak dalej.
  • stackoverflow.com/questions/3840558/…
  • Użyj podstawowego cmd dla linux: time yourprogram.sh, które @Marius Cotofana wyjaśnił

Odpowiedź

Jeśli chcesz, aby czas trwania był wyrażony w sekundach, na górze użyj

start=$SECONDS 

, a na końcu

duration=$(( SECONDS - start )) 

Komentarze

Odpowiedź

Możesz użyć wbudowanego w Linuksa polecenia time. Ze strony podręcznika:

czas POLECENIE [argumenty]

czas określa, które informacje zostaną przesłane ay o zasobach używanych przez POLECENIE z łańcucha FORMAT. Jeśli format nie jest określony w wierszu poleceń, ale zmienna środowiskowa TIME jest ustawiona, jej wartość jest używana jako format.

Aby ustawić czas cleanup.sh skrypt, użyj:

$ time cleanup.sh 

Komentarze

Odpowiedź

Zdaję sobie sprawę, że to dość stare pytanie, ale tak właśnie robię to, gdy chcę / chcę wiedzieć, jak długo coś trwało.

Bash ma wbudowany licznik sekund w postaci wewnętrznej zmiennej o nazwie SECONDS (zobacz: tutaj dla innych zmiennych wewnętrznych)

Umieść SECONDS=0 przed tym, co „ponownie sprawdzasz czas działania. Musi to nastąpić po wprowadzeniu danych przez użytkownika, aby uzyskać dobry wynik, jeśli pytasz 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 znać czas w sekundach, możesz uprościć powyższe do:

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 

Komentarze

  • Skrót dla tych, którzy nie Nie chcę tak skomplikowanego formatowania czasu: date +%T -d "1/1 + $SECONDS sec" (ograniczone do mniej niż 24 godzin, ale możesz dostosować także, dodając dni)
  • Doskonały link do TLDP ' zmiennych wewnętrznych . Dziękuję za to!

Odpowiedź

#!/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}" 

Komentarze

  • Cześć, witamy w Unix SE! Odpowiedzi zawierające tylko kod nie ' nie wyglądają bardzo dobrze, może mógłbyś wyjaśnić, co robi twój skrypt.
  • Dlaczego tutaj mnożysz przez 1000, a następnie dzielisz przez 1000 * modyfikator później dla wszystkich wyświetlanych wartości?

Odpowiedź

@anask zrobić sprytne rozwiązanie tego problemu Odpowiedź, po prostu zalecam użycie natywnego $SECONDS zamiast utworzenia nowego

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 printf, a podział polega na konwersji sekund, które upłynęły, na odpowiadające im godziny, minuty, sekundy, odpowiednio.

Odpowiedź

Ostatnio próbowałem czegoś podobnego. Proponuję:

date1=$(date +%s) #Use this arithmetic to determine elapsed time since defining date1 $(( $(date +%s) - $date1 )) #While loop using timer while ! [ $(( $(date +%s) - $date1 )) -gt 10 ]; do #Terminal timer -n won"t append new line, so the echo will replace itself. ##There is also some date formatting to achieve: HH:MM:SS. echo -ne "$(date -u --date @$(( $(date +%s) - $date1 )) +%H:%M:%S)\r" done 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *