letöltheti az időt a bash-ban

A következőt szeretném megtenni egy szkript egy pontján:

start_time=date 

és ez egy folyamat vagy folyamatok lefutása után:

end_time=date 

, majd tegye ezt:

elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process" 

Hogyan tenném?

Megjegyzések

Válasz

A korszak óta eltelt idő segítségével könnyedén meghatározhat egy időtartamot egy szkriptben

man date %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999) 

.

start_time="$(date -u +%s)" sleep 5 end_time="$(date -u +%s)" elapsed="$(($end_time-$start_time))" echo "Total of $elapsed seconds elapsed for process" Total of 5 seconds elapsed for process 

A Bash nem támogatja a lebegőpontos számokat, ezért egy olyan külső eszközt kell használnia, mint a bc az idők összehasonlításához 1475705058.042270582-1475705053.040524971

start_time="$(date -u +%s.%N)" sleep 5 end_time="$(date -u +%s.%N)" elapsed="$(bc <<<"$end_time-$start_time")" echo "Total of $elapsed seconds elapsed for process" Total of 5.001884264 seconds elapsed for process 

Megjegyzések

  • ez az, amit Kerestem .. tartalmazhat-e mikrotímet?
  • Próbálja ki a date '+%s.%N'
  • A dátumot a következővel kell meghívnia: date -u, hogy elkerülje a parancs DST-jét és helyi problémáit. Kérjük, olvassa el ezt a választ
  • Látva, hogy a bc (hagyományosan) hogyan valósul meg a dc-vel, közvetlenül használhatja a dc-t: elapsed=$(dc -e "$end_time $start_time - p")

Válasz

A bash beépített időzítő változó

start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete" 

Megjegyzések

  • Vagy SECONDS=0; ...; echo "$SECONDS". Vigyázzon a hibával .

Válasz

@jasonwryan már javasolta, de “belevetem válaszként, mivel ez is az a lehetőségem, amikor egy szkriptet szeretnék időzíteni. Az idő myscript használatához egyszerűen használja:

time myscript 

Megjegyzések

  • Időről időre megpróbálom, de ez inkább arra szolgál, amikor szükségem van rá izoláld vagy időzítsd a szkriptem alszakaszait.
  • Ez nem hasznos, ha a származtatott eltelt időt magadban akarod felhasználni, például annak kiszámításához, hogy a szkript hány egységet tudott feldolgozni másodpercenként. .

Válasz

Tetszik a @Miata válasza, mert felhívja a figyelmet a date +%s megoldás. Azonban a @Miata tartalmazza a következőt: .%N, de nem vagyok biztos benne, milyen előnyökkel jár majd a nanoszekundumok vizsgálata, ha felmerül a date végrehajtásának költsége parancs alhéjban. Tehát a gyakorlatban a date +%s elegendőnek kell lennie. A másik megjegyzendő dolog: date +%s korszak 1970-01-01 00:00:00 UTC. Ami azt jelenti, hogy az idő abszolút korszakkal rendelkezik, és megoszthatja az időmérést a shell szkript különböző példányai vagy különböző gépek között.

(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24 

Szeretem @glenn jackman ” válasza, mert a SECONDS bash beépített változóra vonatkozik. Itt meg kell jegyezni, hogy a korszak az az idő, amikor a folyamat elindult. Tehát ezt a technikát csak arra használhatjuk, hogy mérje meg az adott szkripten belüli dolgok idejét:

(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24 

Másik dolog, hogy az összes hozzárendelésemet a (( )) parancs. azaz átírhatja:

cmd=$(( some_expression )) 

mint

(( cmd=some_expression )) 

Ezzel , minimalizálhatjuk a $ szimbólum előfordulását.

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