[linux] 경과 시간을 계산하는 Bash 스크립트
내 명령 실행에 경과 된 시간을 계산하기 위해 bash에서 스크립트를 작성 중입니다. 다음을 고려하십시오.
STARTTIME=$(date +%s)
#command block that takes time to complete...
#........
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."
내 논리가 정확하다고 생각하지만 다음과 같은 인쇄물로 끝납니다.
“이 작업을 완료하는 데 몇 초가 걸립니다 …”
내 문자열 평가에 문제가 있습니까?
나는 bash 변수가 형식화되지 않았다고 생각한다. 그럼에도 불구하고 bash에 “string to integer”메소드가 있다면 좋아할 것이다.
답변
어느 $(())
또는 $[]
산술 연산의 결과를 계산하기 위해 작동한다. 당신은 사용하고 있습니다$()
은 단순히 문자열을 가져 와서 명령으로 평가하는 것을 사용하고 있습니다. 약간 미묘한 차이입니다. 도움이 되었기를 바랍니다.
이 답변에 대한 주석에서 tink가 지적했듯이 $[]
더 이상 사용되지 않으며 $(())
선호되어야합니다.
답변
내부 변수 “$ SECONDS”를 사용하는 것이 매우 깔끔합니다.
SECONDS=0 ; sleep 10 ; echo $SECONDS
답변
에서 번호를 ENDTIME
명령으로 실행하려고합니다 . 또한와 같은 오류가 표시되어야합니다 1370306857: command not found
. 대신 산술 확장을 사용하십시오 .
echo "It takes $(($ENDTIME - $STARTTIME)) seconds to complete this task..."
명령을 별도의 스크립트에 저장하고 commands.sh
time 명령을 사용할 수도 있습니다.
time commands.sh
답변
time
적절한 형식 문자열과 함께 여기에서 Bash의 키워드를 사용할 수 있습니다.
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.
선택적 p 는 소수점 뒤의 소수 자릿수 인 정밀도를 지정하는 숫자입니다. 값이 0이면 소수점이나 분수가 출력되지 않습니다. 소수점 이하 세 자리까지 지정할 수 있습니다. 3보다 큰 p의 값은 3으로 변경됩니다. p 를 지정하지 않으면 값 3이 사용됩니다.
선택 사항
l
은 MMmSS.FFs 형식의 분을 포함하여 더 긴 형식을 지정합니다 . p 값은 분수가 포함되는지 여부를 결정합니다.이 변수가 설정되어 있지 않으면 Bash는 값이있는 것처럼 작동합니다.
$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
값이 null이면 타이밍 정보가 표시되지 않습니다. 형식 문자열이 표시 될 때 후행 개행이 추가됩니다.
답변
더 큰 숫자의 경우 더 읽기 쉬운 형식으로 인쇄 할 수 있습니다. 아래 예제는 다른 예제와 동일하지만 “인간”형식으로도 인쇄합니다.
secs_to_human() {
if [[ -z ${1} || ${1} -lt 60 ]] ;then
min=0 ; secs="${1}"
else
time_mins=$(echo "scale=2; ${1}/60" | bc)
min=$(echo ${time_mins} | cut -d'.' -f1)
secs="0.$(echo ${time_mins} | cut -d'.' -f2)"
secs=$(echo ${secs}*60|bc|awk '{print int($1+0.5)}')
fi
echo "Time Elapsed : ${min} minutes and ${secs} seconds."
}
간단한 테스트 :
secs_to_human "300"
secs_to_human "305"
secs_to_human "59"
secs_to_human "60"
secs_to_human "660"
secs_to_human "3000"
산출:
Time Elapsed : 5 minutes and 0 seconds.
Time Elapsed : 5 minutes and 5 seconds.
Time Elapsed : 0 minutes and 59 seconds.
Time Elapsed : 1 minutes and 0 seconds.
Time Elapsed : 11 minutes and 0 seconds.
Time Elapsed : 50 minutes and 0 seconds.
다른 게시물에 설명 된대로 스크립트에서 사용하려면 (시작 지점을 캡처 한 다음 종료 시간과 함께 함수를 호출합니다.
start=$(date +%s)
# << performs some task here >>
secs_to_human "$(($(date +%s) - ${start}))"
답변
다음 코드를 시도하십시오.
start=$(date +'%s') && sleep 5 && echo "It took $(($(date +'%s') - $start)) seconds"
답변
이것은 Mike Q의 기능에 대한 한 줄짜리 대안입니다.
secs_to_human() {
echo "$(( ${1} / 3600 ))h $(( (${1} / 60) % 60 ))m $(( ${1} % 60 ))s"
}