Bir zamanlayıcı bash nasıl kullanılır?


30

Senaryonun en başında başlayacak ve sonunda duracak bir zamanlayıcıya ihtiyacım vardı.


2
Lütfen ulaşmak istediğiniz hedefi yazın. komut dosyası çalışma zamanını ölçmek için komut kullanın time(saat ./script.sh), geçerli saatin çıktısını almak için datekomut vb.
acele


Temel linux cmd: kullanın time yourprogram.sh, bu @Marius Cotofana açıkladı
Martijn van Wezel

Yanıtlar:



23

Linux'un yerleşik timekomutunu kullanabilirsiniz. Man sayfasından:

zaman COMMAND [argümanlar]

Zaman, COMMAND tarafından FORMAT dizesinden kullanılan kaynaklar hakkında hangi bilgilerin görüntüleneceğini belirler. Komut satırında herhangi bir format belirtilmemişse, ancak TIME ortam değişkeni ayarlanmışsa, değeri format olarak kullanılır.

cleanup.shKomut dosyasını zamanlamak için şunu kullanın:

$ time cleanup.sh

1
Kullandığını biliyorum time. hackernoon.com/…
km6zla

8

Bunun çok eski bir soru olduğunun farkındayım, ancak bir şeyin ne kadar sürdüğünü bilmek istediğim / ihtiyaç duyduğumda herhangi bir şey için yapmamın yolu budur.

Bash adında bir dahili değişken biçiminde yerleşik bir saniye sayacı vardır SECONDS(bakınız: diğer dahili değişkenler için burada )

SECONDS=0Çalışma zamanını ne kontrol ediyorsan önce koy . İyi bir sonuç elde etmek için herhangi bir kullanıcı girişinden sonra gelmesi gerekir; bu nedenle, sizden bilgi isterseniz, bilgi istemi üzerine yazınız.

Ardından, kontrol ettiğiniz şeyin sonuna şunu koyun:

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

Süreyi yalnızca saniye cinsinden bilmek istiyorsanız, yukarıdakileri basitleştirebilirsiniz:

echo "Completed in $SECONDS seconds"

Örnek olarak:

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

3
Böylesine ayrıntılı bir zaman formatlaması istemeyenlere kısayol: date +%T -d "1/1 + $SECONDS sec"(24 saatten daha az bir süre ile sınırlı, ancak siz de gün eklemek için uyarlayabilirsiniz)
xhienne

1
#!/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}'

1
Merhaba, Unix SE’e hoş geldiniz! Yalnızca kod yanıtları pek iyi görünmüyor, belki de betiğinizin ne yaptığını açıklayabilirsiniz.
peterh Monica

0

@anask bu cevap için akıllıca bir çözüm yapar, sadece $SECONDSyeni bir tane oluşturmak için yerel dili kullanmanızı öneririm

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}'

Ve printfbölümün amacı, geçen saniyeleri karşılık gelen birlik Saat'e dönüştürmek, Mins, Secs.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.