Hoe gebruik je een timer in bash?

Ik had een timer nodig die aan het begin van het script begint en aan het einde stopt.

Opmerkingen

  • schrijf alsjeblieft een doel dat je wilt bereiken. gebruik het time commando (time ./script.sh) om de werktijd van het script te meten, gebruik het date commando om de huidige tijd af te drukken, enzovoort.
  • stackoverflow.com/questions/3840558/…
  • Gebruik basis linux cmd: time yourprogram.sh, die @Marius Cotofana heeft uitgelegd

Antwoord

Als je de duur in seconden wilt, gebruik dan bovenaan

start=$SECONDS 

en aan het einde

duration=$(( SECONDS - start )) 

Reacties

Antwoord

Je zou Linux” s ingebouwde time commando kunnen gebruiken. Vanaf de man-pagina:

tijd COMMAND [argumenten]

tijd bepaalt welke informatie moet worden weergegeven ay over de bronnen die worden gebruikt door de COMMAND van de string FORMAT. Als er geen indeling is opgegeven op de opdrachtregel, maar de omgevingsvariabele TIME is ingesteld, wordt de waarde ervan gebruikt als indeling.

Om de cleanup.sh script, gebruik:

$ time cleanup.sh 

Reacties

Antwoord

Ik realiseer me dat dit een vrij oude vraag is, maar dit is de manier waarop ik het voor alles doe als ik wil / moet weten hoe lang het duurde voordat iets liep.

Bash heeft een ingebouwde seconden timer in de vorm van een interne variabele genaamd SECONDS (zie: hier voor andere interne variabelen)

Zet SECONDS=0 voor datgene waarvan je de looptijd controleert. Het moet na elke gebruikersinvoer zijn om een goed resultaat te krijgen als u “om informatie vraagt, plaats het dan achter de prompt (s).

Zet dit dan aan het einde van wat u” aan het controleren bent:

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 

Als u alleen de tijd in seconden wilt weten, kunt u het bovenstaande vereenvoudigen tot:

echo "Completed in $SECONDS seconds" 

Als voorbeeld:

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 

Reacties

  • Een snelkoppeling voor degenen die geen Ik wil zon uitgebreide tijdopmaak: date +%T -d "1/1 + $SECONDS sec" (beperkt tot minder dan 24 uur, maar je kunt ook aanpassen om dagen toe te voegen)
  • Uitstekende link naar TLDP ' s interne variabelen . Bedankt daarvoor!

Antwoord

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

Opmerkingen

  • Hallo, welkom op de Unix SE! Antwoorden met alleen code ' zien er niet erg goed uit, misschien kun je uitleggen wat je script doet.
  • Waarom vermenigvuldig je hier met 1000 en deel je dan door 1000 * modifier later voor alle weergegeven waarden?

Answer

@anask doe hier een slimme oplossing voor antwoord, ik raad alleen aan om in plaats daarvan de native $SECONDS te gebruiken om een nieuwe te maken

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

Het doel van de printf en de deling is om de verstreken seconden om te rekenen naar de corresponderende eenheid Uren, minuten, seconden, respectievelijk.

Antwoord

Ik heb onlangs iets soortgelijks geprobeerd. Ik zou willen voorstellen:

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 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *