Kuinka käyttää ajastinta bashissa?

Tarvitsin ajastimen, joka alkaa komentosarjan alusta ja pysähtyy lopussa.

Kommentit

  • kirjoita tavoite, jonka haluat saavuttaa. skriptin työajan mittaamiseksi käytä time -komentoa (aika ./script.sh), tulosta nykyinen aika käyttämällä komentoa date.
  • stackoverflow.com/questions/3840558/…
  • Käytä linuxin perus cmd: time yourprogram.sh, jonka @Marius Cotofana selitti

vastaus

Jos haluat keston sekunteina, käytä yläosassa

start=$SECONDS 

ja lopussa

duration=$(( SECONDS - start )) 

Kommentit

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

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.

  • Miksi kerrot täällä tuhannella ja jaat sitten 1000 * muokkaaja myöhemmin kaikille näytetyille arvoille?
  • 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 

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *