Bash에서 타이머를 사용하는 방법?

스크립트의 맨 처음부터 끝까지 멈출 타이머가 필요했습니다.

댓글

  • 달성하고자하는 목표를 적어주십시오. 스크립트 작업 시간을 측정하려면 time 명령 (time ./script.sh)을 사용하고 현재 시간을 인쇄하려면 date 명령을 사용하십시오.
  • stackoverflow.com/questions/3840558/ …
  • @Marius Cotofana가 설명한 기본 Linux cmd : time yourprogram.sh 사용

Answer

초 단위의 시간을 원하면 상단에서

start=$SECONDS 

그리고 마지막

duration=$(( SECONDS - start )) 

댓글

답변

Linux의 기본 제공 time 명령을 사용할 수 있습니다. man 페이지에서 :

time COMMAND [arguments]

time은 표시 할 정보를 결정합니다. ay 문자열 FORMAT에서 COMMAND가 사용하는 리소스에 대해 설명합니다. 명령 줄에 형식이 지정되지 않았지만 TIME 환경 변수가 설정된 경우 해당 값이 형식으로 사용됩니다.

cleanup.sh 스크립트, 사용 :

$ time cleanup.sh 

댓글

답변

이것은 꽤 오래된 질문이라는 것을 알고 있지만 실행하는 데 걸리는 시간을 알고 싶거나 알고 싶을 때 작업을 수행하는 방법입니다.

Bash에는 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 

댓글

  • 금지 자들을위한 단축키 이렇게 정교한 시간 형식을 원하지 않습니다. date +%T -d "1/1 + $SECONDS sec" (24 시간 미만으로 제한되지만 요일 추가에도 적용 가능)
  • TLDP '의 내부 변수 에 대한 훌륭한 링크. 감사합니다!

답변

#!/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}" 

댓글

  • 안녕하세요. Unix SE에 오신 것을 환영합니다! 코드 전용 답변은 ' 잘 보이지 않습니다. 스크립트가 수행하는 작업을 설명 할 수 있습니다.
  • 여기서 1000을 곱한 다음 다음으로 나누는 이유는 무엇입니까? 표시되는 모든 값에 대해 나중에 1000 * 수정자가 있습니까?

Answer

@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 및 분할은 경과 된 초를 해당 단위 인 Hours, Mins, Secs로 각각 변환하는 것입니다.

Answer

최근 비슷한 시도를했습니다. 다음을 제안합니다.

date1=$(date +%s) #Use this arithmetic to determine elapsed time since defining date1 $(( $(date +%s) - $date1 )) #While loop using timer while ! [ $(( $(date +%s) - $date1 )) -gt 10 ]; do #Terminal timer -n won"t append new line, so the echo will replace itself. ##There is also some date formatting to achieve: HH:MM:SS. echo -ne "$(date -u --date @$(( $(date +%s) - $date1 )) +%H:%M:%S)\r" done 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다