Bagaimana cara menggunakan timer di bash?

30

Saya membutuhkan penghitung waktu yang akan dimulai pada awal skrip dan berhenti di akhir.

Pikiran aneh
sumber
2
tolong, tulis tujuan yang ingin Anda capai. untuk mengukur skrip waktu kerja gunakan timeperintah (waktu ./script.sh), untuk mencetak dateperintah waktu saat ini gunakan dan sebagainya.
buru
stackoverflow.com/questions/3840558/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Gunakan dasar linux cmd time yourprogram.sh:, itulah yang dijelaskan oleh @Marius Cotofana
Martijn van Wezel

Jawaban:

29

Jika Anda menginginkan durasinya dalam hitungan detik, gunakan di bagian atas

start=$SECONDS

dan pada akhirnya

duration=$(( SECONDS - start ))
glenn jackman
sumber
Bagaimana jika dibutuhkan lebih dari detik?
Pithikos
@Pithikos Lihat jawaban Philip Gibbons di bawah ini
xhienne
23

Anda dapat menggunakan timeperintah bawaan Linux . Dari halaman manual:

waktu PERINTAH [argumen]

waktu menentukan informasi yang akan ditampilkan tentang sumber daya yang digunakan oleh PERINTAH dari string FORMAT. Jika tidak ada format yang ditentukan pada baris perintah, tetapi variabel lingkungan TIME diatur, nilainya digunakan sebagai format.

Untuk menentukan waktu cleanup.shskrip, gunakan:

$ time cleanup.sh
Marius Cotofana
sumber
1
Ketahuilah bahwa timeAnda menggunakan. hackernoon.com/...
km6zla
8

Saya menyadari ini adalah pertanyaan yang cukup lama tetapi ini adalah cara saya melakukannya untuk apa pun ketika saya ingin / perlu tahu berapa lama sesuatu berjalan.

Bash memiliki penghitung waktu bawaan dalam bentuk variabel internal bernama SECONDS(lihat: di sini untuk variabel internal lainnya)

Taruh SECONDS=0sebelum apa pun yang Anda periksa waktu menjalankan. Perlu setelah input pengguna apa pun untuk mendapatkan hasil yang baik jadi jika Anda meminta informasi, letakkan setelah prompt.

Lalu, letakkan ini di akhir yang Anda periksa:

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

Jika Anda hanya ingin mengetahui waktu dalam hitungan detik, Anda dapat menyederhanakan hal di atas menjadi:

echo "Completed in $SECONDS seconds"

Sebagai contoh:

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
Philip Gibbons
sumber
3
Pintasan untuk mereka yang tidak menginginkan format waktu yang rumit: date +%T -d "1/1 + $SECONDS sec"(terbatas hingga kurang dari 24 jam, tetapi Anda juga dapat beradaptasi untuk menambah hari)
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}'
anask
sumber
1
Hai, selamat datang di Unix SE! Jawaban hanya kode tidak terlihat sangat baik, mungkin Anda bisa menjelaskan apa yang sedang dilakukan skrip Anda.
peterh mengatakan mengembalikan Monica
0

@anask lakukan solusi cerdas untuk jawaban ini, hanya saya rekomendasikan untuk menggunakan yang asli $SECONDSsebagai gantinya untuk membuat yang baru

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

Tujuan dari printfdan divisi ini adalah untuk mengkonversi detik yang telah berlalu menjadi Jam kesatuan, Menit, Menit, yang terkait.

Alex Galindo
sumber