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