Hur använder jag en timer i bash?

Jag behövde en timer som börjar i början av skriptet och slutar i slutet.

Kommentarer

  • snälla, skriv ett mål du vill uppnå. för att mäta skriptets arbetstid använd time kommando (tid ./script.sh), för att skriva ut aktuell tid använd date kommando och så vidare.
  • stackoverflow.com/questions/3840558/…
  • Använd grundläggande linux cmd: time yourprogram.sh, som @Marius Cotofana förklarade

Svar

Om du vill ha varaktigheten i sekunder, använd

start=$SECONDS 

och i slutet

duration=$(( SECONDS - start )) 

Kommentarer

Svar

Du kan använda Linux” inbyggda time -kommando. Från mansidan:

tid COMMAND [argument]

tid bestämmer vilken information som ska flyttas ay om de resurser som används av COMMAND från strängen FORMAT. Om inget format anges på kommandoraden, men TIME-miljövariabeln är inställd, används dess värde som format.

För att tida cleanup.sh skript, använd:

$ time cleanup.sh 

Kommentarer

Svar

Jag inser att det här är en ganska gammal fråga men det är så jag gör det för vad som helst när jag vill / behöver veta hur lång tid det tog att köra.

Bash har en inbyggd sekundtimer i form av en intern variabel med namnet SECONDS (se: här för andra interna variabler)

Sätt SECONDS=0 före vad du än kontrollerar körtiden för. Det måste vara efter någon användarinmatning för att få ett bra resultat så om du frågar efter information, lägg den efter uppmaningen.

Sätt sedan i slutet av vad du kontrollerar:

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 

Om du bara vill veta tiden i sekunder kan du förenkla ovanstående till:

echo "Completed in $SECONDS seconds" 

Som ett exempel:

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 genväg för dem som inte vill inte ha en så detaljerad tidsformatering: date +%T -d "1/1 + $SECONDS sec" (begränsad till mindre än 24 timmar, men du kan anpassa dig för att lägga till dagar också)
  • Utmärkt länk till TLDP ' Interna variabler . Tack för 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, välkommen till Unix SE! Kodfria svar ' ser inte väldigt bra ut, kanske du kan förklara vad ditt skript gör.
  • Varför multiplicerar du med 1000 här och delar sedan med 1000 * modifierare senare för alla visade värden?

Svar

@anask gör en smart lösning för detta svar, bara jag rekommenderar att du använder den inhemska $SECONDS istället för att skapa 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}" 

Syftet med printf och uppdelningen är att konvertera de förflutna sekunderna till motsvarande enhetstimmar, minuter, sekunder, respektive.

Svar

Jag har nyligen försökt något liknande. Jag föreslår:

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 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *