सवाल समय बीतने की गणना करने के लिए बैश स्क्रिप्ट


मैं अपने आदेशों के निष्पादन के लिए समाप्त समय की गणना करने के लिए बैश में एक स्क्रिप्ट लिख रहा हूं, इस पर विचार करें:

STARTTIME=$(date +%s)
#command block that takes time to complete...
#........
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."

मुझे लगता है कि मेरा तर्क सही है हालांकि मैं निम्नलिखित प्रिंट आउट के साथ समाप्त होता हूं:

"इस कार्य को पूरा करने में सेकंड लगते हैं ..."

मेरे स्ट्रिंग मूल्यांकन के साथ कुछ भी गलत है?

मेरा मानना ​​है कि बैश वैरिएबल अवांछित हैं, फिर भी मुझे प्यार होगा अगर बाश में "स्ट्रिंग टू इंटीजर" विधि है।


76
2018-06-04 00:41


मूल


@OnnipotentEntity: क्या आप इसे एक उत्तर के रूप में बना सकते हैं? - Michael Mao
निश्चित बात माइकल माओ। - OmnipotentEntity


जवाब:


भी $(()) या $[] अंकगणितीय ऑपरेशन के परिणाम की गणना करने के लिए काम करेगा। आप उपयोग कर रहे हैं $() जो बस स्ट्रिंग ले रहा है और इसे कमांड के रूप में मूल्यांकन कर रहा है। यह एक सूक्ष्म भेद का थोड़ा सा है। उम्मीद है की यह मदद करेगा।

जैसा कि इस जवाब पर टिप्पणियों में टिंक ने बताया, $[] बहिष्कृत है, और $(()) अनुकूल होना चाहिए।


58
2018-06-04 01:03



आप उन दोनों को चारों ओर स्वैप करना चाहेंगे, क्योंकि बैश 4.x मैन-पेज बताता है कि $ [] बहिष्कृत है और भविष्य के संस्करणों में हटा दिया जाएगा। - tink
धन्यवाद, मैं अनजान था। - OmnipotentEntity


मुझे आंतरिक चर "$ SECONDS" का उपयोग करने के लिए यह बहुत साफ लगता है

SECONDS=0 ; sleep 10 ; echo $SECONDS


89
2017-07-27 21:51



अद्भुत, dest दुष्प्रभाव है? - g13013
केवल सफलता =) - Lon Kaut
सफलता की ज़रूरत है, अपना इस्तेमाल करें - Gromish
$SECONDS वास्तव में / bin / bash के लिए काम करता है। यह डेबियन और उबंटू में डिफ़ॉल्ट खोल / बिन / डैश के लिए काम नहीं करता है। - Cameron Taggart
इस समाधान के लिए नकारात्मक यह है कि यह केवल पूरे सेकंड को मापता है, यानी यदि आपको उप-दूसरे परिशुद्धता की आवश्यकता होती है तो उपयोग योग्य नहीं है। - Czechnology


आप संख्या को निष्पादित करने का प्रयास कर रहे हैं ENDTIME एक आदेश के रूप में। आपको एक त्रुटि भी दिखानी चाहिए 1370306857: command not found। इसके बजाय उपयोग करें अंकगणितीय विस्तार:

echo "It takes $(($ENDTIME - $STARTTIME)) seconds to complete this task..."

आप कमांड को एक अलग स्क्रिप्ट में भी सहेज सकते हैं, commands.sh, और समय कमांड का उपयोग करें:

time commands.sh

43
2018-06-04 00:48





आप बैश का उपयोग कर सकते हैं time एक उपयुक्त प्रारूप स्ट्रिंग के साथ यहाँ कीवर्ड

TIMEFORMAT='It takes %R seconds to complete this task...'
time {
    #command block that takes time to complete...
    #........
 }

यहाँ क्या है संदर्भ के बारे में कहते हैं TIMEFORMAT:

इस पैरामीटर का मान एक प्रारूप स्ट्रिंग के रूप में प्रयोग किया जाता है जो निर्दिष्ट करता है कि पाइपलाइनों के लिए समय-समय पर जानकारी कैसे पूर्ववत की जाती है time   आरक्षित शब्द प्रदर्शित किया जाना चाहिए। '%'चरित्र एक परिचय देता है   बचने के क्रम को एक समय मूल्य या अन्य जानकारी में विस्तारित किया जाता है।   बचने के अनुक्रम और उनके अर्थ निम्नानुसार हैं; ब्रेसिज़   वैकल्पिक भागों को इंगित करें।

%%

    A literal ‘%’.
%[p][l]R

    The elapsed time in seconds.
%[p][l]U

    The number of CPU seconds spent in user mode.
%[p][l]S

    The number of CPU seconds spent in system mode.
%P

    The CPU percentage, computed as (%U + %S) / %R. 

वैकल्पिक पी सटीक निर्दिष्ट करने वाला एक अंक है, दशमलव बिंदु के बाद आंशिक अंकों की संख्या। 0 का मान कोई कारण नहीं है   आउटपुट होने के लिए दशमलव बिंदु या अंश। के बाद तीनों स्थानों पर   दशमलव बिंदु निर्दिष्ट किया जा सकता है; के मूल्य पी 3 से अधिक बदल गए हैं   3. अगर पी निर्दिष्ट नहीं है, मान 3 का उपयोग किया जाता है।

वैकल्पिक l फ़ॉर्म के मिनटों सहित, एक लंबा प्रारूप निर्दिष्ट करता है MMmSS.FFs। का मूल्य पी निर्धारित करता है कि क्या है या नहीं   अंश शामिल है।

यदि यह चर सेट नहीं है, तो बैश कार्य करता है जैसे कि उसके पास मूल्य था

$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'

यदि मान शून्य है, तो कोई समय की जानकारी प्रदर्शित नहीं होती है। स्वरूप स्ट्रिंग प्रदर्शित होने पर एक पिछली नईलाइन जोड़ दी जाती है।


21
2018-03-14 06:48





निम्नलिखित कोड आज़माएं:

start=$(date +'%s') && sleep 5 && echo "It took $(($(date +'%s') - $start)) seconds"

5
2018-03-14 05:26





विलुप्त सेकंड विकल्प के साथ समय का उपयोग करने का प्रयास करें:

/usr/bin/time -f%e sleep 1 बाश के नीचे

या \time -f%e sleep 1 इंटरैक्टिव बैश में।

समय आदमी पृष्ठ देखें:

बैश खोल के उपयोगकर्ताओं को चलाने के लिए एक स्पष्ट पथ का उपयोग करने की आवश्यकता है          बाहरी समय कमांड और शैल बिल्टिन संस्करण नहीं। सिस्टम पर          जहां / usr / bin में समय स्थापित है, पहला उदाहरण बन जाएगा               / usr / bin / time wc / etc / hosts

तथा

FORMATTING THE OUTPUT
...
    %      A literal '%'.
    e      Elapsed  real  (wall  clock) time used by the process, in
                 seconds.

1
2018-06-04 01:59



/bin/time यहां काम नहीं करेगा: ओपी का उल्लेख है खंड। तो हमें वास्तव में कीवर्ड की आवश्यकता है time यहाँ। - gniourf_gniourf


start=$(date +%Y%m%d%H%M%S);
for x in {1..5};
do echo $x;
sleep 1; done;
end=$(date +%Y%m%d%H%M%S);
elapsed=$(($end-$start));
ftime=$(for((i=1;i<=$((${#end}-${#elapsed}));i++));
        do echo -n "-";
        done;
        echo ${elapsed});
echo -e "Start  : ${start}\nStop   : ${end}\nElapsed: ${ftime}"

Start  : 20171108005304
Stop   : 20171108005310
Elapsed: -------------6

-1
2017-11-08 00:00





    #!/bin/bash

    time_elapsed(){
    appstop=$1; appstart=$2

    ss_strt=${appstart:12:2} ;ss_stop=${appstop:12:2}
    mm_strt=${appstart:10:2} ;mm_stop=${appstop:10:2}
     hh_strt=${appstart:8:2} ; hh_stop=${appstop:8:2}
     dd_strt=${appstart:6:2} ; dd_stop=${appstop:6:2}
     mh_strt=${appstart:4:2} ; mh_stop=${appstop:4:2}
     yy_strt=${appstart:0:4} ; yy_stop=${appstop:0:4}

    if [ "${ss_stop}" -lt "${ss_strt}" ]; then ss_stop=$((ss_stop+60)); mm_stop=$((mm_stop-1)); fi
    if [ "${mm_stop}" -lt "0" ]; then mm_stop=$((mm_stop+60)); hh_stop=$((hh_stop-1)); fi
    if [ "${mm_stop}" -lt "${mm_strt}" ]; then mm_stop=$((mm_stop+60)); hh_stop=$((hh_stop-1)); fi
    if [ "${hh_stop}" -lt "0" ]; then hh_stop=$((hh_stop+24)); dd_stop=$((dd_stop-1)); fi
    if [ "${hh_stop}" -lt "${hh_strt}" ]; then hh_stop=$((hh_stop+24)); dd_stop=$((dd_stop-1)); fi

    if [ "${dd_stop}" -lt "0" ]; then dd_stop=$((dd_stop+$(mh_days $mh_stop $yy_stop))); mh_stop=$((mh_stop-1)); fi
    if [ "${dd_stop}" -lt "${dd_strt}" ]; then dd_stop=$((dd_stop+$(mh_days $mh_stop $yy_stop))); mh_stop=$((mh_stop-1)); fi

    if [ "${mh_stop}" -lt "0" ]; then mh_stop=$((mh_stop+12)); yy_stop=$((yy_stop-1)); fi
    if [ "${mh_stop}" -lt "${mh_strt}" ]; then mh_stop=$((mh_stop+12)); yy_stop=$((yy_stop-1)); fi

    ss_espd=$((10#${ss_stop}-10#${ss_strt})); if [ "${#ss_espd}" -le "1" ]; then ss_espd=$(for((i=1;i<=$((${#ss_stop}-${#ss_espd}));i++)); do echo -n "0"; done; echo ${ss_espd}); fi
    mm_espd=$((10#${mm_stop}-10#${mm_strt})); if [ "${#mm_espd}" -le "1" ]; then mm_espd=$(for((i=1;i<=$((${#mm_stop}-${#mm_espd}));i++)); do echo -n "0"; done; echo ${mm_espd}); fi
    hh_espd=$((10#${hh_stop}-10#${hh_strt})); if [ "${#hh_espd}" -le "1" ]; then hh_espd=$(for((i=1;i<=$((${#hh_stop}-${#hh_espd}));i++)); do echo -n "0"; done; echo ${hh_espd}); fi
    dd_espd=$((10#${dd_stop}-10#${dd_strt})); if [ "${#dd_espd}" -le "1" ]; then dd_espd=$(for((i=1;i<=$((${#dd_stop}-${#dd_espd}));i++)); do echo -n "0"; done; echo ${dd_espd}); fi
    mh_espd=$((10#${mh_stop}-10#${mh_strt})); if [ "${#mh_espd}" -le "1" ]; then mh_espd=$(for((i=1;i<=$((${#mh_stop}-${#mh_espd}));i++)); do echo -n "0"; done; echo ${mh_espd}); fi
    yy_espd=$((10#${yy_stop}-10#${yy_strt})); if [ "${#yy_espd}" -le "1" ]; then yy_espd=$(for((i=1;i<=$((${#yy_stop}-${#yy_espd}));i++)); do echo -n "0"; done; echo ${yy_espd}); fi

    echo -e "${yy_espd}-${mh_espd}-${dd_espd} ${hh_espd}:${mm_espd}:${ss_espd}"
    #return $(echo -e "${yy_espd}-${mh_espd}-${dd_espd} ${hh_espd}:${mm_espd}:${ss_espd}")
    }

    mh_days(){
    mh_stop=$1; yy_stop=$2; #also checks if it's leap year or not

    case $mh_stop in
     [1,3,5,7,8,10,12]) mh_stop=31
     ;;
     2) (( !(yy_stop % 4) && (yy_stop % 100 || !(yy_stop % 400) ) )) && mh_stop=29 || mh_stop=28
     ;;
     [4,6,9,11]) mh_stop=30
     ;;
    esac

    return ${mh_stop}
    }

    appstart=$(date +%Y%m%d%H%M%S); read -p "Wait some time, then press nay-key..." key; appstop=$(date +%Y%m%d%H%M%S); elapsed=$(time_elapsed $appstop $appstart); echo -e "Start...: ${appstart:0:4}-${appstart:4:2}-${appstart:6:2} ${appstart:8:2}:${appstart:10:2}:${appstart:12:2}\nStop....: ${appstop:0:4}-${appstop:4:2}-${appstop:6:2} ${appstop:8:2}:${appstop:10:2}:${appstop:12:2}\n$(printf '%0.1s' "="{1..30})\nElapsed.: ${elapsed}"

    exit 0


-------------------------------------------- return
Wait some time, then press nay-key...
Start...: 2017-11-09 03:22:17
Stop....: 2017-11-09 03:22:18
==============================
Elapsed.: 0000-00-00 00:00:01

-1
2017-11-09 02:27