Bash скрыпт для вылічэнні часу мінула

Я пішу сцэнар у Баше, каб вылічыць час, якое прайшло для выканання маіх каманд, разгледзець наступныя пытанні:

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

Я думаю, што мая логіка дакладная, аднак я ў канчатковым выніку з наступнага раздрукоўкай:

«Гэта займае ўсяго некалькі секунд, каб выканаць гэтую задачу ...»

Усё, што здарылася з маёй ацэнкай радкі?

Я лічу, што Баш пераменнага нетипизированным, я хацеў бы, калі ёсць «радок у цэлае» метад у Баше, тым не менш.

76
@OmnipotentEntity: вы можаце зрабіць гэта ў якасці адказу?
дададзена аўтар Michael Mao, крыніца
Вядома, што Майкл Мао.
дададзена аўтар OmnipotentEntity, крыніца

8 адказы

Я лічу, гэта вельмі чысты, каб выкарыстоўваць ўнутраныя зменныя «$ SECONDS»

<�Код> СЕКУНД = 0; сон 10; Рэха $ SECONDS

89
дададзена
<�Код> $ SECONDS сапраўды працуе для/бен/Баш. Яна не працуе на/бен/працяжнік абалонкі па змаўчанні ў Debian і Ubuntu.
дададзена аўтар Cameron Taggart, крыніца
Даунсайд да гэтага рашэння з'яўляецца тое, што ён вымярае толькі цэлыя секунды, гэта значыць не выкарыстоўваць, калі трэба, на поўдзень ад другой дакладнасці.
дададзена аўтар Czechnology, крыніца
Патрэба поспеху, выкарыстоўваць вашыя
дададзена аўтар Gromish, крыніца
выдатна, Dest гэта пабочныя эфекты?
дададзена аўтар g13013, крыніца
Толькі поспех =)
дададзена аўтар Lon Kaut, крыніца

Альбо $ (()) або $ [] будзе працаваць для вылічэнні выніку арыфметычнай аперацыі. Вы карыстаецеся $() , які проста бярэ радок і ацэньваючы яго як каманду. Гэта крыху тонкае адрозненне. Спадзяюся, што гэта дапамагае.

Як Дзынь адзначыў у каментары на гэты адказ, $ [] з'яўляецца састарэлым, і $ (()) варта аддаваць перавагу.

59
дададзена
Вы можаце памяняць месцамі гэтыя два вакол, а Баш 4.x чалавек-старонак станаў, што <�б> $ [] з'яўляецца састарэлым і будзе выдалены ў будучых версіях.
дададзена аўтар tink, крыніца
Дзякуй, я не ведаў.
дададзена аўтар OmnipotentEntity, крыніца

Вы спрабуеце выканаць шэраг у = Канчатковае у якасці каманды. Вы павінны ўбачыць паведамленне пра памылку, як 1370306857: каманда не знойдзена . Замест таго, каб выкарыстоўваць арыфметычнае пашырэнне ў :

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

Акрамя таго, можна захаваць каманды ў асобным скрыпце, commands.sh , і выкарыстоўваць каманду часу:

time commands.sh
43
дададзена

Вы можаце выкарыстоўваць у Bash час ключавое слова тут з адпаведнай радком фармату

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

Вось тое, што спасылка кажа аб TimeFormat :

<�Р> Значэнне гэтага параметру выкарыстоўваецца ў якасці радкі фармату з указаннем, як інфармацыя аб сінхранізацыі для трубаправодаў з прэфіксам час   зарэзерваваныя слова павінна адлюстроўвацца. «<�Код>% » сімвал ўводзіць,   бегчы паслядоўнасць, якая пашыраецца да значэння часу або іншай інфармацыі.   Кіравальныя паслядоўнасці і іх значэння наступным чынам; брекеты   абазначаюць неабавязковыя часткі. </р> <�Папярэдне> %%     Літаральнае «%». % [Р] [л] Р     Мінулы час у секундах. % [Р] [л] U     Колькасць секунд CPU ў карыстацкім рэжыме. % [Р] [л] S     Колькасць секунд CPU, праведзеных у сістэмным рэжыме. % P     Працэнт працэсара, вылічаецца як (% U +% S) /% R.      <�Р> Апцыянальны <�ет> р з'яўляецца лічбай для вызначэння дакладнасці, колькасць дробавых лічбаў пасля дзесятковай кропкі. Ня Значэнне 0 выклікае няма   дзесятковая кропка або дробны для вываду. У большасці трох месцаў пасля таго, як   дзесятковая кропка можа быць вызначана; значэння р больш, чым 3 змяняюцца   да 3. Калі <�ет> р не пазначаны, значэнне 3 выкарыстоўваецца.      <�Р> Неабавязковы L вызначае больш доўгі фармат, уключаючы хвіліны, у выглядзе MMmSS.FFs. Значэнне р вызначае, ці з'яўляецца ці не   фракцыя ўключана. </р>      <�Р> Калі гэтая зменная не зададзена, Bash дзейнічае, як калі б яно мела значэнне <�Папярэдне> $ '\ nreal \ т% 3LR \ Nuser \ т% 3LU \ Nsys \ т% 3LS'      <�Р> Калі значэнне роўна нулю, не адлюстроўваецца інфармацыя сінхранізацыі. Апушчаная новая радок дадаецца, калі адлюстровываюцца радок фармату. </Р>
21
дададзена

Паспрабуйце наступны код:

start=$(date +'%s') && sleep 5 && echo "It took $(($(date +'%s') - $start)) seconds"
5
дададзена

паспрабуйце выкарыстоўваць час з опцыяй завяршаемай секунд:

/usr/bin/time -f%e sleep 1 under bash.

або \ час -f% е сон 1 у інтэрактыўным Баш.

звярніцеся да старонкі часу:

<�Р> Карыстальнікі Баш абалонкі павінны выкарыстоўваць відавочны шлях для запуску          знешняя каманда часу і ня абалонка убудаванай варыянт. Аб сістэме          дзе час усталёўваецца ў/USR/бен, першы прыклад стане               / USR/бен/час туалет/і г.д./хасты

і

FORMATTING THE OUTPUT
...
    %      A literal '%'.
    e      Elapsed  real  (wall  clock) time used by the process, in
                 seconds.
1
дададзена
<�Код>/bin/час не будзе працаваць тут: OP згадвае <�я> блок . Так што нам сапраўды трэба ключавое слова час тут.
дададзена аўтар 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
дададзена
    #!/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
дададзена