Hvordan bruges en timer i bash?

Jeg havde brug for en timer, der starter i starten af scriptet og stopper i slutningen.

Kommentarer

  • tak, skriv et mål, du vil nå. for at måle scriptets arbejdstid brug time kommando (tid ./script.sh), for at udskrive aktuel tid brug date kommando og så videre.
  • stackoverflow.com/questions/3840558/…
  • Brug grundlæggende linux cmd: time yourprogram.sh, som @Marius Cotofana forklarede

Svar

Hvis du vil have varigheden i sekunder, skal du øverst bruge

start=$SECONDS 

og i slutningen

duration=$(( SECONDS - start )) 

Kommentarer

Svar

Du kan bruge Linux” indbyggede time kommando. Fra mandsiden:

tid COMMAND [argumenter]

tid bestemmer, hvilken information der skal fortrænges ay om de ressourcer, der bruges af COMMAND fra strengen FORMAT. Hvis der ikke er angivet noget format på kommandolinjen, men TIME-miljøvariablen er indstillet, bruges dens værdi som formatet.

For at tidsindstille cleanup.sh script, brug:

$ time cleanup.sh 

Kommentarer

Svar

Jeg er klar over, at dette er et ret gammelt spørgsmål, men det er sådan, jeg gør det for noget, når jeg vil / har brug for at vide, hvor lang tid noget tog at løbe.

Bash har en indbygget sekunder-timer i form af en intern variabel med navnet SECONDS (se: her for andre interne variabler)

Sæt SECONDS=0 før det, du kontrollerer kørselstiden for. Det skal være efter ethvert brugerinput for at få et godt resultat, så hvis du beder om information, skal du lægge den efter prompten (e).

Derefter skal du placere den i slutningen af det, du kontrollerer:

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 kun vil vide 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 genvej til dem, der ikke vil ikke have en så detaljeret tidsformatering: date +%T -d "1/1 + $SECONDS sec" (begrænset til mindre end 24 timer, men du kan også tilpasse for at tilføje dage)
  • Fremragende link til TLDP ' Interne variabler . Tak 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

  • Hej, velkommen til Unix SE! Kun kode-svar ' ser ikke godt ud, måske kunne du forklare, hvad dit script laver.
  • Hvorfor multiplicerer du med 1000 her og divider derefter med 1000 * modifikator senere for alle de viste værdier?

Svar

@anask gør en smart løsning på dette svar, bare jeg anbefaler at bruge den indfødte $SECONDS i stedet for at oprette 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 divisionen er at konvertere de forløbne sekunder til den tilsvarende enhed Hours, Mins, Secs, respect.

Svar

Jeg har for nylig prøvet noget 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 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *