Potřeboval jsem časovač, který začne na samém začátku skriptu a zastaví se na konci.
Komentáře
Odpověď
Pokud chcete trvání v sekundách, použijte nahoře
start=$SECONDS
a na konci
duration=$(( SECONDS - start ))
Komentáře
- Co když to bude trvat déle než sekundy?
- @Pithikos Viz Philip Gibbons ' s odpovědí níž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
- Know
time
, který používáte. hackernoon.com/…
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
time
(čas ./script.sh), k tisku aktuálního času použijte příkazdate
atd.time yourprogram.sh
, který @Marius Cotofana vysvětlil