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