Jak používat časovač v bash?

Potřeboval jsem časovač, který začne na samém začátku skriptu a zastaví se na konci.

Komentáře

  • prosím, napište cíl, kterého chcete dosáhnout. k měření pracovní doby skriptu použijte příkaz time (čas ./script.sh), k tisku aktuálního času použijte příkaz date atd.
  • stackoverflow.com/questions/3840558/…
  • Použijte základní linux cmd: time yourprogram.sh, který @Marius Cotofana vysvětlil

Odpověď

Pokud chcete trvání v sekundách, použijte nahoře

start=$SECONDS 

a na konci

duration=$(( SECONDS - start )) 

Komentáře

Odpověď

Můžete použít vestavěný příkaz Linuxu time. Na stránce manuálu:

time COMMAND [argumenty]

time určuje, které informace se mají zobrazit ay o prostředcích použitých PŘÍKAZEM z řetězce FORMAT. Pokud na příkazovém řádku není zadán žádný formát, ale je nastavena proměnná prostředí TIME, použije se jako formát jeho hodnota.

Chcete-li časovat cleanup.sh skript, použijte:

$ time cleanup.sh 

Komentáře

odpověď

Uvědomuji si, že je to docela stará otázka, ale takhle to dělám pro cokoli, když chci / potřebuji vědět, jak dlouho něco trvalo.

Bash má vestavěný sekundový časovač ve formě interní proměnné s názvem SECONDS (viz: zde pro ostatní interní proměnné)

Dejte SECONDS=0 před jakoukoli kontrolu doby běhu. Abyste dosáhli dobrého výsledku, musí být po každém vstupu uživatele pokud požadujete informace, vložte je za výzvy.

Potom to vložte na konec toho, co kontrolujete:

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 

Pokud chcete zjistit čas pouze v sekundách, můžete výše uvedené zjednodušit na:

echo "Completed in $SECONDS seconds" 

Jako příklad:

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 

Komentáře

  • Zkratka pro ty, kdo nechcete takové komplikované formátování času: date +%T -d "1/1 + $SECONDS sec" (omezeno na méně než 24 hodin, ale můžete se přizpůsobit i přidáváním dnů)
  • Vynikající odkaz na TLDP ' s interními proměnnými . Děkujeme za to!

Odpověď

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

Komentáře

  • Ahoj, vítejte na Unix SE! Odpovědi pouze na kód ' nevypadají velmi dobře, možná byste mohli vysvětlit, co váš skript dělá.
  • Proč zde vynásobíte 1000 a poté vydělíte Modifikátor 1000 * později pro všechny zobrazené hodnoty?

Odpovědět

@anask udělat pro to chytré řešení Odpověď, jen doporučuji použít nativní $SECONDS k vytvoření nového

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

Účel printf a rozdělení má převést uplynulé sekundy na odpovídající jednotné hodiny, minuty, sekundy.

Odpovědět

Nedávno jsem se pokoušel o něco podobného. Navrhuji:

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 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *