Hvordan bruke en timer i bash?

Jeg trengte en tidtaker som starter helt i begynnelsen av skriptet og stopper på slutten.

Kommentarer

  • vær så snill, skriv et mål du vil oppnå. for å måle skriptets arbeidstid bruk time kommando (tid ./script.sh), for å skrive ut gjeldende tid bruk date kommando og så videre.
  • stackoverflow.com/questions/3840558/…
  • Bruk grunnleggende linux cmd: time yourprogram.sh, som @Marius Cotofana forklarte

Svar

Hvis du vil ha varigheten i sekunder, bruk

start=$SECONDS 

og på slutten

duration=$(( SECONDS - start )) 

Kommentarer

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

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 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *