Làm thế nào để sử dụng một bộ đếm thời gian trong bash?


30

Tôi cần một bộ đếm thời gian sẽ bắt đầu ở phần đầu của kịch bản và dừng ở cuối.


2
xin vui lòng, viết một mục tiêu bạn muốn đạt được. để đo thời gian làm việc của tập lệnh, sử dụng timelệnh (time ./script.sh), để in datelệnh sử dụng thời gian hiện tại , v.v.
vội vàng


Sử dụng cmd linux cơ bản : time yourprogram.sh, mà @Marius Cotofana đã giải thích
Martijn van Wezel

Câu trả lời:



23

Bạn có thể sử dụng lệnh tích hợp của Linux time. Từ trang người đàn ông:

thời gian điều khiển [đối số]

thời gian xác định thông tin nào sẽ hiển thị về các tài nguyên được sử dụng bởi LỰA CHỌN từ chuỗi FORMAT. Nếu không có định dạng nào được chỉ định trên dòng lệnh, nhưng biến môi trường TIME được đặt, giá trị của nó được sử dụng làm định dạng.

Để tính thời gian cho cleanup.shtập lệnh, sử dụng:

$ time cleanup.sh

1
Biết timebạn đang sử dụng. hackernoon.com/ Quảng cáo
km6zla

8

Tôi nhận ra đây là một câu hỏi khá cũ nhưng đây là cách tôi làm cho bất cứ điều gì khi tôi muốn / cần biết một cái gì đó mất bao lâu để chạy.

Bash có bộ đếm thời gian tích hợp giây dưới dạng một biến nội bộ có tên SECONDS(xem: ở đây để biết các biến nội bộ khác)

Đặt SECONDS=0trước bất cứ điều gì bạn đang kiểm tra thời gian chạy. Nó cần phải theo sau bất kỳ đầu vào của người dùng để có kết quả tốt, vì vậy nếu bạn đang nhắc thông tin, hãy đặt nó sau (các) dấu nhắc.

Sau đó, đặt phần này vào cuối phần bạn đang kiểm tra:

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

Nếu bạn chỉ muốn biết thời gian tính bằng giây, bạn có thể đơn giản hóa phần trên để:

echo "Completed in $SECONDS seconds"

Ví dụ:

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
Một lối tắt cho những người không muốn định dạng thời gian phức tạp như vậy: date +%T -d "1/1 + $SECONDS sec"(giới hạn dưới 24 giờ, nhưng bạn cũng có thể thích nghi để thêm ngày)
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
Xin chào, chào mừng bạn đến với Unix SE! Các câu trả lời chỉ có mã không nhìn rất rõ, có lẽ bạn có thể giải thích kịch bản của mình đang làm gì.
peterh nói rằng phục hồi Monica

0

@anask làm một giải pháp thông minh cho câu trả lời này, chỉ là tôi khuyên bạn nên sử dụng bản địa $SECONDSthay thế để tạo một cái mới

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

Mục đích của printfphân chia và là để chuyển đổi các giây trôi qua thành các giờ thống nhất tương ứng, Phút, Giây, tương ứng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.