Hogyan kell használni az időzítőt a bash-ban?

Szükségem volt egy időzítőre, amely a szkript legelején kezdődik és a végén leáll.

Megjegyzések

  • kérem, írjon egy elérni kívánt célt. a szkript munkaidejének méréséhez használja a time parancsot (idő ./script.sh), az aktuális idő kinyomtatásához használja a date parancsot és így tovább.
  • stackoverflow.com/questions/3840558/…
  • Használja az alap linux cmd-t: time yourprogram.sh, amelyet @Marius Cotofana magyarázott

Válasz

Ha az időtartamot másodpercben szeretné megadni, a tetején használja a

start=$SECONDS 

és a végén

duration=$(( SECONDS - start )) 

Megjegyzések

Válasz

Használhatja a Linux beépített time parancsát. A man oldalról:

idő COMMAND [érvek]

az idő határozza meg, mely információkat kell kiszorítani a FORMAT karakterláncból a COMMAND által használt erőforrásokról. Ha a parancssorban nincs megadva formátum, de a TIME környezeti változó be van állítva, akkor annak értékét használják formátumként.

A cleanup.sh szkript, használja:

$ time cleanup.sh 

Megjegyzések

Válasz

Tudomásul veszem, hogy ez egy meglehetősen régi kérdés, de ezt bármiért csinálom, amikor tudni akarom / kell, hogy tudjam, mennyi ideig tartott valami futni.

Bash beépített másodperces időzítővel rendelkezik egy belső változó formájában, amelynek neve: SECONDS (lásd: itt egyéb belső változók esetén)

Helyezze az SECONDS=0 elemet a futtatási idő ellenőrzése elé. Bármely felhasználói bemenet után kell lennie, hogy jó eredményt érjen el. ha információkat kér, tegye a felszólítás (ok) után.

Ezután tegye ezt az ellenőrzött adatok végére:

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 

Ha csak másodpercekben szeretné megtudni az időt, egyszerűsítheti a fentieket:

echo "Completed in $SECONDS seconds" 

Például:

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 

Megjegyzések

  • Parancsikon azok számára, akik nem teszik nem akar ilyen bonyolult időformázást: date +%T -d "1/1 + $SECONDS sec" (24 óránál rövidebb időre korlátozva, de a napok hozzáadásához is alkalmazkodhat)
  • Kiváló link a TLDP ' s belső változókhoz . Köszönöm ezt!

Válasz

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

Hozzászólások

  • Sziasztok, üdvözlünk az Unix SE-n! Csak a kóddal adható válaszok <

nem néznek ki nagyon, talán meg tudnád magyarázni, hogy a szkripted mit csinál.

  • Miért szorzol itt 1000-gyel, majd osztasz 1000 * módosító később az összes megjelenített értékhez?
  • Válasz

    @anask csináljon erre okos megoldást válasz, csak azt javaslom, hogy inkább a natív $SECONDS -t használja új létrehozásához.

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

    A printf és az osztás az eltelt másodperceket a megfelelő egységek Órákra, Minuszokra, Másodpercekre konvertálja.

    Válasz

    Nemrégiben valami hasonlóval próbálkoztam. Azt javaslom:

    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 

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük