타이머처럼 계속해서 다음 실행까지의 시간을 표시하려면 스크립트가 필요합니다. 가능합니까?
답변1
그것은 마치
t=1
until [ "$t" -le 0 ]
do
t=$(($(date -d '2015-02-24 16:40:00' +'%s')-$(date +'%s')))
sleep 1
tput clear
echo $t
done
답변2
몇 초마다 포크할 필요가 없도록 쉘 수학을 사용하여 많은 작업을 수행할 수 있지만 시간이 잘 유지되도록 가끔씩 일종의 동기화 장치를 사용하는 것이 좋습니다.
아래 루프는 의 초기 값을 설정한 $h
다음 15초마다 값을 감소 $m
시키고 $s
터미널 화면의 왼쪽 상단에 카운트다운 줄을 인쇄합니다.(행 1, 열 1, \033[Home
). 문제 없이 백그라운드에서 설정할 수 있지만, trap
한동안 실행될 예정이라면 먼저 다른 도구를 사용하여 보호하는 것이 좋습니다.
(h=23 m=1 s=60; trap '' TTOU
until [ "$(((h-=(!(m-=!(s-=s?15:-45)*(m?1:-59))&&!s))+m+s))" -eq 0 ]
do sleep 15
printf "\0337\033[H\033[KT- %02d : %02d : %02d\0338" \
"$h" "$((m?m:60))" "$((s?s:60))"
done) &
인쇄되는 선은 여기 맨 위 선과 같습니다.
T- 22 : 49 : 60
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ % (
h=23 m=1 s=60; trap '' TTOU
사실 아직 실행중인 걸 깜빡했는데 터미널이 스크롤이 안되면 계속 같은 곳에 그림이 계속 그려지네요..
T- 22 : 48 : 30
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ % (
h=23 m=1 s=60; trap '' TTOU
그러나 터미널이 스크롤되면 다른 줄이 인쇄되기 전까지 최대 15초가 경과할 때까지 해당 줄이 화면 밖으로 스크롤됩니다. 사용된 이스케이프는 일반적으로 다음과 같이 해석됩니다.sc
(커서 저장 \0337
:),hr
(메인 행 \033[H
: ),kl
(킬링라인 \033[K
:)그리고rc
(커서 복원 \0338
:). 이들 중 하나라도 효과가 없다면 tput
해당 값을 확인해야 합니다. 기본적으로는 먼저 커서 위치를 저장한 뒤 터미널 화면 상단으로 이동해 맨 윗줄을 지우고 카운트다운을 인쇄한다. 커서 위치가 복원됩니다.
감소량의 균형을 맞추는 방식으로 작동합니다.
좋다...
h - !(m - !(s - s < 60 ? 15 : -45 ) && !s )
...더 많은 것이 있지만 이 방법은 더 작은 값이 0으로 감소할 때 더 큰 값에서 1을 뺍니다. 따라서 초 값이 1에서 0으로 감소하면 분 값도 감소합니다.둘 다분과 초는 0이고 시 값도 감소합니다.
루프가 완료되면... 아무 일도 일어나지 않습니다. 당신이 무엇을 하려는지 잘 모르겠지만, 그것이 무엇이든 거기에 넣어야 합니다 done
.
거의 모든 값으로 시작할 수 있어야 하지만, 작성된 대로 $h
$m
econds 값은 15초 간격으로 감소할 것으로 예상됩니다.$s
$s
(이것은 쉽게 변경되지만). 어쨌든 이 점을 명심하시기 바랍니다.