Aveam nevoie de un cronometru care să înceapă chiar de la începutul scriptului și să se oprească la sfârșit.
Comentarii
Răspuns
Dacă doriți durata în secunde, utilizați în partea de sus
start=$SECONDS
și la final
duration=$(( SECONDS - start ))
Comentarii
- Ce se întâmplă dacă durează mai mult de câteva secunde?
- @Pithikos Consultați Philip Gibbons ' răspunsul de mai jos
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
- Cunoașteți
time
pe care îl utilizați. hackernoon.com/…
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
time
(time ./script.sh), pentru a imprima timpul curent utilizați comandadate
și așa mai departe.time yourprogram.sh
, pe care l-a explicat @Marius Cotofana