날짜, 산술 및 삼항 연산자를 한 줄에 표시

날짜, 산술 및 삼항 연산자를 한 줄에 표시

Ubuntu에서 스크립트가 최소 x초가 걸리는지 확인하는 간단한 코드가 있습니다(여기서는 500).

t1=$(date +%s)
# script is here
t2=$(date +%s)
let "t = 500 - $t2 + $t1"
(( t = t>0 ? t : 1 ))
sleep $t

코드는 완벽하게 작동하지만 내 코딩이 효율적이지 않다고 생각합니다. 이 세 줄은

t2=$(date +%s)
let "t = 500 - $t2 + $t1"
(( t = t>0 ? t : 1 ))

한 줄로 표현해야 합니다. 내 질문은 코드를 개선하는 방법입니다.

답변1

귀하의 스크립트는 이식이 불가능하고( let및 를 사용하고 있기 때문에 (( .. ))) 혼란스럽습니다(둘 다 let(( .. ))), 문서가 부족하고(주석 없음, 변수 이름은 설명적이지 않음) 약간 안전하지 않습니다(따옴표 붙은 확장명이 없기 때문에 $t).

다시 작성하고 싶다면 이것은 내 것입니다.

#!/bin/sh

min_duration=500
t_start=$(date +%s)
# script is here
t_end=$(date +%s)
elapsed=$(( t_end - t_start ))

# sleep long enough to make sure 'min_duration' seconds has elapsed, 
# but at least 1 second
sleep "$(( elapsed < min_duration ? min_duration - elapsed : 1 ))"

답변2

bash특수 매개변수를 사용하여 이를 수행하는 방법은 다음과 같습니다 SECONDS.

#!/bin/bash                                                                                                                                                                                  

SECONDS=0
# script is here                                                                                                                                                                             
sleep "$(( 500 > SECONDS ? 500 - SECONDS : 1 ))"

일반적으로 SECONDS스크립트가 시작된 이후의 시간을 초 단위로 반환하지만 타이머를 (재)설정하기 위해 어떤 값이라도 할당할 수 있습니다.

답변3

간단한 대안은 백그라운드에서 절전 모드를 실행한 다음 wait다른 코드를 실행한 후 절전 모드를 실행하는 것입니다.

  #!/bin/bash

  sleep 500 &
  # script is here
  wait

관련 정보