Jeg trengte en tidtaker som starter helt i begynnelsen av skriptet og stopper på slutten.
Kommentarer
Svar
Hvis du vil ha varigheten i sekunder, bruk
start=$SECONDS
og på slutten
duration=$(( SECONDS - start ))
Kommentarer
- Hva om det tar mer enn sekunder?
- @Pithikos Se Philip Gibbons ' s svar nedenfor
Svar
Du kan bruke Linuxs innebygde time
kommando. Fra mansiden:
tid COMMAND [argumenter]
tid bestemmer hvilken informasjon som skal forskyves ay om ressursene som brukes av COMMAND fra strengen FORMAT. Hvis det ikke er angitt noe format på kommandolinjen, men TIME-miljøvariabelen er angitt, brukes dens verdi som format. id = «35bae96fa6″>
skript, bruk:
$ time cleanup.sh
Kommentarer
- Vet
time
du bruker. hackernoon.com/…
Svar
Jeg skjønner at dette er et ganske gammelt spørsmål, men det er slik jeg gjør det for hva som helst når jeg vil / trenger å vite hvor lang tid det tok å løpe.
Bash har en innebygd sekunder-timer i form av en intern variabel kalt SECONDS
(se: her for andre interne variabler)
Sett SECONDS=0
før det du sjekker kjøretiden til. Det må være etter brukerinngang for å få et godt resultat så hvis du ber om informasjon, legg den etter ledeteksten (e).
Sett deretter dette på slutten av det du sjekker:
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
Hvis du bare vil vite tiden i sekunder, kan du forenkle ovenstående til:
echo "Completed in $SECONDS seconds"
Som et eksempel:
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
Kommentarer
- En snarvei for de som ikke t vil ha en så forseggjort tidsformatering:
date +%T -d "1/1 + $SECONDS sec"
(begrenset til mindre enn 24 timer, men du kan tilpasse for å legge til dager også) - Utmerket lenke til TLDP ' s Interne variabler . Takk for det!
Svar
#!/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}"
Kommentarer
- Hei, velkommen på Unix SE! Kun kode-koder ser ikke ' ikke veldig bra ut, kanskje du kan forklare hva skriptet ditt gjør.
- Hvorfor multipliserer du med 1000 her og deler deretter med 1000 * modifikator senere for alle de viste verdiene?
Svar
@anask gjøre en smart løsning for dette svar, bare jeg anbefaler å bruke den innfødte $SECONDS
i stedet for å lage en ny
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}"
Formålet med printf
og divisjonen er å konvertere de forløpte sekundene til tilsvarende enhet Hours, Mins, Secs, respect.
Svar
Jeg har nylig prøvd noe lignende. Jeg vil foreslå:
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
kommando (tid ./script.sh), for å skrive ut gjeldende tid brukdate
kommando og så videre.time yourprogram.sh
, som @Marius Cotofana forklarte