bash에서 타이머를 사용하는 방법은 무엇입니까?


30

스크립트의 맨 처음부터 시작하여 끝에서 멈추는 타이머가 필요했습니다.


2
달성하고자하는 목표를 작성하십시오. 스크립트 작업 시간 측정 time명령 (time ./script.sh), 현재 시간 사용 date명령 등 을 출력 합니다.
돌진


time yourprogram.sh@Marius Cotofana가 설명한 기본 Linux cmd :를 사용하십시오.
Martijn van Wezel

답변:



23

Linux의 내장 time명령을 사용할 수 있습니다 . 매뉴얼 페이지에서 :

time COMMAND [인수]

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

cleanup.sh스크립트 시간을 정하려면 다음을 사용하십시오.

$ time cleanup.sh

1
time당신이 사용 하는 것을 알고 있습니다. hackernoon.com/…
km6zla

8

나는 이것이 꽤 오래된 질문이라는 것을 알고 있지만 이것은 무언가를 실행하는 데 걸린 시간을 알고 싶어 할 때 무엇이든 할 수있는 방법입니다.

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

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
안녕하세요, 유닉스 SE에 오신 것을 환영합니다! 코드 전용 답변은 잘 보이지 않습니다. 아마도 스크립트가 수행하는 작업을 설명 할 수 있습니다.
피터는 모니카

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및 나누기 의 목적은 경과 된 초를 각각 해당하는 단위 시간, 분, 초로 변환하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.