बश में टाइमर का उपयोग कैसे करें?


30

मुझे एक टाइमर की आवश्यकता थी जो स्क्रिप्ट की बहुत शुरुआत में शुरू होगा और अंत में बंद हो जाएगा।


2
कृपया, एक लक्ष्य लिखें जिसे आप प्राप्त करना चाहते हैं। मापने के लिए स्क्रिप्ट काम करने के समय का उपयोग करें timeकमांड (समय ।/cript.sh), वर्तमान समय का उपयोग प्रिंटआउट करने के लिए dateऔर इसी तरह।
भीड़


मूल लिनक्स cmd का उपयोग करें: time yourprogram.shउस @ मारी कोतोफ़ाना ने समझाया
मार्टिज़न वैन

जवाबों:



23

आप लिनक्स की अंतर्निहित timeकमांड का उपयोग कर सकते हैं । आदमी पृष्ठ से:

समय सीमा [तर्क]

समय निर्धारित करता है कि स्ट्रिंग FORMAT से COMMAND द्वारा उपयोग किए जाने वाले संसाधनों के बारे में कौन सी जानकारी प्रदर्शित करनी है। यदि कमांड लाइन पर कोई प्रारूप निर्दिष्ट नहीं किया गया है, लेकिन टाइम पर्यावरण चर सेट किया गया है, तो इसका मान प्रारूप के रूप में उपयोग किया जाता है।

cleanup.shस्क्रिप्ट का समय पर उपयोग करने के लिए:

$ time cleanup.sh

1
पता है timeआप उपयोग कर रहे हैं। hackernoon.com/…
km6zla

8

मुझे लगता है कि यह एक बहुत पुराना प्रश्न है, लेकिन यही वह तरीका है जब मैं इसे किसी भी चीज के लिए करता हूं जब मैं चाहता हूं / यह जानने की आवश्यकता होती है कि कुछ चलाने में कितना समय लगा।

बैश में आंतरिक चर नाम के रूप में एक अंतर्निहित सेकंड टाइमर होता है SECONDS(देखें: अन्य आंतरिक चर के लिए यहां )

SECONDS=0इससे पहले कि आप रन समय की जाँच कर रहे हैं रखो । अच्छा परिणाम प्राप्त करने के लिए किसी भी उपयोगकर्ता इनपुट के बाद होना चाहिए, इसलिए यदि आप जानकारी के लिए संकेत कर रहे हैं, तो प्रॉम्प्ट के बाद इसे डाल दें।

फिर, इसे आप जो जाँच रहे हैं उसके अंत में रखें:

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

यदि आप केवल सेकंड में समय जानना चाहते हैं, तो आप उपरोक्त को सरल बना सकते हैं:

echo "Completed in $SECONDS seconds"

उदहारण के लिए:

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
उन लोगों के लिए एक शॉर्टकट जो इस तरह के एक विस्तृत समय स्वरूपण नहीं करना चाहती: date +%T -d "1/1 + $SECONDS sec"(24 घंटों से भी कम समय तक ही सीमित है, लेकिन आप दिन भी जोड़ने के लिए अनुकूलित कर सकते हैं)
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
नमस्ते, यूनिक्स एसई पर आपका स्वागत है! कोड-केवल उत्तर बहुत अच्छी तरह से नहीं दिखते हैं, हो सकता है कि आप समझा सकें कि आपकी स्क्रिप्ट क्या कर रही है।
पीटर ने कहा कि मोनिका

0

@anask इस जवाब के लिए एक चतुर समाधान करते हैं, बस मैं $SECONDSएक नया बनाने के बजाय देशी का उपयोग करने की सलाह देता हूं

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और विभाजन का उद्देश्य संबंधित सेकंड्स, मिन्स, सेक्स से संबंधित बीता हुआ सेकंड को परिवर्तित करना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.