Tarvitsin ajastimen, joka alkaa komentosarjan alusta ja pysähtyy lopussa.
Kommentit
vastaus
Jos haluat keston sekunteina, käytä yläosassa
start=$SECONDS
ja lopussa
duration=$(( SECONDS - start ))
Kommentit
- Entä jos se kestää yli sekunteja?
- @Pithikos Katso Philip Gibbons ' s vastaus alla
vastaus
Voit käyttää Linuxin sisäänrakennettua komentoa time
. Man -sivulta:
aika COMMAND [argumentit]
aika määrittää, mitkä tiedot siirretään ay resursseista, joita COMMAND käyttää FORMAT-merkkijonosta. Jos komentorivillä ei ole määritetty muotoa, mutta TIME-ympäristömuuttuja on asetettu, sen arvoa käytetään muotona.
Aikaa cleanup.sh
-skripti, käytä:
$ time cleanup.sh
kommentteja
- tietää käyttämäsi
time
. hackernoon.com/…
Vastaa
Ymmärrän, että tämä on melko vanha kysymys, mutta tällä tavalla teen sen mihin tahansa, kun haluan / tarvitsen tietää, kuinka kauan jonkin suorittaminen kesti.
Bashissa on sisäänrakennettu sekuntiajastin sisäisen muuttujan muodossa nimeltä SECONDS
(katso: täältä muille sisäisille muuttujille)
Laita SECONDS=0
ennen kuin tarkistat ajoajan. Sen on oltava minkä tahansa käyttäjän syötteen jälkeen, jotta saat hyvän tuloksen, joten jos pyydät tietoja, laita ne kehotteiden jälkeen.
Laita tämä sitten tarkistamasi tarkistuksen loppuun:
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
Jos haluat tietää ajan vain sekunteina, voit yksinkertaistaa yllä olevan:
echo "Completed in $SECONDS seconds"
Esimerkkinä:
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
Kommentit
- Pikakuvake niille, jotka et halua tällaista tarkkaa aikamuotoilua:
date +%T -d "1/1 + $SECONDS sec"
(rajoitettu alle 24 tuntiin, mutta voit mukautua myös päivien lisäämiseen) - Erinomainen linkki TLDP ' -sisäisiin muuttujiin . Kiitos siitä!
Vastaa
#!/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}"
Kommentit
- Hei, tervetuloa Unix SE: hen! Vain koodivastaukset eivät <
näytä hyvältä, ehkä selittäisit mitä komentosarjasi tekee.
Vastaa
@anask tee älykäs ratkaisu tähän Vastaus, suosittelen vain uuden natiivin käyttämistä alkuperäisen $SECONDS
-sivun avulla.
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}"
printf
ja jako on muuntaa kuluneet sekunnit vastaaviksi yhtenäisyystunneiksi, minuuteiksi, sekunneiksi.
Vastaa
Olen äskettäin yrittänyt jotain vastaavaa. Ehdotan:
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
-komentoa (aika ./script.sh), tulosta nykyinen aika käyttämällä komentoadate
.time yourprogram.sh
, jonka @Marius Cotofana selitti