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říkazdateatd.time yourprogram.sh, který @Marius Cotofana vysvětlil