SECONDS 변수는 실제로 무엇을 합니까?

SECONDS 변수는 실제로 무엇을 합니까?

그래서 제목에서 알 수 있듯이 저는 이것을 발견했습니다.이상한sleep기본적으로 increment시간을 매개변수로 제공합니다. 예:

#!/usr/bin/env bash
set -x
SECONDS="1"
while true; do
    echo "hello" || true
    sleep "$SECONDS"
done

하지만 그건 인정합니다. 변수 이름을 다르게 지정하는 대신 해당 변수를 사용했기 때문입니다 $SECONDS. 제가 볼 수 있듯이 변수가 하는 일은 시계의 초 단위만 출력하는 것뿐입니다. 제가 추측한 날짜와 비슷하네요.

하지만 실제로는 또 어떤 역할을 합니까? 나는 Bash 문서나 공개 스크립트에서 이에 대해 아무것도 본 적이 없다고 생각합니다.

답변1

~에서배쉬 매뉴얼 페이지:

두번째

이 매개변수가 참조될 때마다 쉘이 호출된 이후의 시간(초)이 반환됩니다. 값이 SECONDS에 할당되면 후속 참조에서 반환되는 값은 할당 이후의 초 수에 할당된 값을 더한 값입니다. SECONDS가 설정되지 않으면 나중에 재설정되더라도 특수 속성이 손실됩니다.

따라서 설정을 사용하면 SECONDS이제 11에서 시작하여 변수가 경과 시간에 따라 증가함에 따라 while 루프가 반복될 때마다 두 배로 증가하는 카운터를 다시 시작하여 SECONDS멋진 형상 시퀀스를 제공합니다 sleep.

+ SECONDS=1
+ true
+ echo hello
hello
+ sleep 1
+ true
+ echo hello
hello
+ sleep 2
+ true
+ echo hello
hello
+ sleep 4
+ true
+ echo hello
hello
...

답변2

SECONDS의 일반적인 용도는 장기 실행 작업의 시간 초과입니다. 이는 반복 작업에 소비된 시간으로 인해 발생하는 드리프트를 방지하므로 루프 반복 계산보다 더 정확합니다.

EXPIRED=$(( SECONDS + 5000 ))
while (( SECONDS < EXPIRED )); do
    #.. some repeated task.
    sleep 30
done

이와 같은 작업을 수행하는 경우 스크립트의 어느 위치에서나 SECONDS에 할당하는 것은 안전하지 않습니다. 원래 시작 시간을 기준으로 다른 모든 간격을 유지하는 것이 좋습니다. 또는 처음에 SECONDS를 현재 날짜 자정 이후의 초 수와 같이 더 유용한 값으로 설정할 수 있습니다. 이는 반복 작업을 다음 풀타임 단위로 동기화하려는 경우에도 유용합니다 sleep $(( 60 - SECONDS % 60 )).

SECONDS를 자정 이후의 초 수로 초기화하기 위해 다음을 찾았습니다.

SECONDS=$(( $( date '+ 3600 * %H + 60 * %M + %S' ) ))

서브쉘은 매우 특별합니다. 상위 쉘의 SECONDS를 내보내기로 상속하므로 이를 변경할 수 있지만(예: 0으로 재설정) 상위 쉘은 이러한 변경 사항을 볼 수 없습니다. 독립형 쉘 스크립트는 SECONDS=0으로 시작합니다.

답변3

이 경우 $SECONDS에는

  1. 잘못된 변수 이름입니다. Bash 내장 "SECONDS"와 혼동됩니다.
  2. 명령의 매개변수입니다 sleep.

sleep명령의 기본값은 초입니다. then SECONDS값을 할당 1하고 이를 명령에 전달하면 sleepwhile 루프 처리를 1초 동안 일시 중지한 다음 조건이 충족될 때까지 루프 등을 다시 처리합니다.

이를 테스트하려면 터미널을 열고 입력한 후 을 sleep 1클릭하세요 ENTER. 셸은 1초 동안 일시 중지된 다음 커서를 사용자에게 반환합니다.

관련 정보