Jag behövde en timer som börjar i början av skriptet och slutar i slutet.
Kommentarer
Svar
Om du vill ha varaktigheten i sekunder, använd
start=$SECONDS
och i slutet
duration=$(( SECONDS - start ))
Kommentarer
- Vad händer om det tar mer än sekunder?
- @Pithikos Se Philip Gibbons ' s nedan
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
- Vet
time
du använder. hackernoon.com/…
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
time
kommando (tid ./script.sh), för att skriva ut aktuell tid använddate
kommando och så vidare.time yourprogram.sh
, som @Marius Cotofana förklarade