Cum se folosește un cronometru în bash?

Aveam nevoie de un cronometru care să înceapă chiar de la începutul scriptului și să se oprească la sfârșit.

Comentarii

  • vă rugăm să scrieți un obiectiv pe care doriți să îl atingeți. pentru a măsura timpul de lucru al scriptului utilizați comanda time (time ./script.sh), pentru a imprima timpul curent utilizați comanda date și așa mai departe.
  • stackoverflow.com/questions/3840558/…
  • Utilizați linux cmd de bază: time yourprogram.sh, pe care l-a explicat @Marius Cotofana

Răspuns

Dacă doriți durata în secunde, utilizați în partea de sus

start=$SECONDS 

și la final

duration=$(( SECONDS - start )) 

Comentarii

Răspunsul

Puteți utiliza comanda încorporată time din Linux. Din pagina de manual:

time COMMAND [argumente]

time determină ce informații să deplaseze despre resursele utilizate de COMANDĂ din șirul FORMAT. Dacă nu este specificat niciun format pe linia de comandă, dar variabila de mediu TIME este setată, valoarea sa este utilizată ca format.

Pentru a temporiza cleanup.sh script, utilizați:

$ time cleanup.sh 

Comentarii

Răspuns

Îmi dau seama că este o întrebare destul de veche, dar așa o fac pentru orice, când vreau / trebuie să știu cât a durat ceva să ruleze.

Bash are un temporizator de secunde încorporat sub forma unei variabile interne numite SECONDS (vezi: aici pentru alte variabile interne)

Puneți SECONDS=0 înainte de orice verificați timpul de rulare. Trebuie să fie după orice introducere a utilizatorului pentru a obține un rezultat bun, astfel încât dacă solicitați informații, puneți-le după solicitare.

Apoi, puneți-le la sfârșitul a ceea ce verificați:

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 

Dacă doriți doar să știți ora în secunde, puteți simplifica cele de mai sus pentru:

echo "Completed in $SECONDS seconds" 

Ca exemplu:

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 

Comentarii

  • O comandă rapidă pentru cei care nu au nu doresc o formatare a timpului atât de elaborată: date +%T -d "1/1 + $SECONDS sec" (limitat la mai puțin de 24 de ore, dar vă puteți adapta și pentru a adăuga zile)
  • Link excelent către TLDP ' variabile interne . Vă mulțumim pentru asta!

Răspuns

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

Comentarii

  • Bună, bun venit pe Unix SE! Răspunsurile numai pentru cod nu ' nu arată foarte bine, poate ați putea explica ce face scriptul dvs.
  • De ce înmulțiți cu 1000 aici și apoi împărțiți la 1000 * modificator mai târziu pentru toate valorile afișate?

Răspundeți

@anask faceți o soluție inteligentă pentru acest lucru răspuns, recomand doar să folosiți $SECONDS nativ în loc să creați unul nou

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}" 

Scopul printf și împărțirea este de a converti secundele trecute la unitatea corespunzătoare Ore, Min, Sec, respectiv.

Răspuns

Am încercat recent ceva similar. Aș sugera:

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 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *