다음과 같이 날짜(일-시-분)가 지정된 쉘을 작성하고 싶습니다.
10:00 AM Sun
2:30 PM Mon
...
정확한 날짜와 시간까지 절전 모드로 유지됩니다. 한 가지 방법은 현재 날짜를 가져와 차이를 계산할 수 있는 것입니다. 그런 다음 초로 변환하고 해당 시간 동안 자십시오.
그러나 쉘 스크립트를 사용하여 이 작업을 수행하는 방법을 잘 모르겠습니다.
#!/bin/bash
now=$(date '+%A %W %Y %X')
date = 2:30 PM Mon
difference = ??
sleep difference
답변1
사용자가 명령을 사용할 수 있는 경우 at
이는 완벽한 사용입니다 .
$ at 08:00 022116
at> myscript.sh
at> <----------- ctrl-d here
job 9 at 2016-02-21 08:00
at
"사용자는 실행할 수 없습니다."와 같은 메시지가 나타나면 syadmin에게 이 사용자 가 환경에서 어떻게 사용되는지에 따라 at.allow
파일에 이 사용자를 추가하거나 파일에서 제거하도록 요청하십시오.at.deny
물론 대본을 작성하는 도중에 오늘의 긴 잠을 자고 싶지 않은 경우는 예외입니다. 그렇더라도 스크립트를 두 부분으로 분할하고 유지하려는 변수를 파일에 쓴 다음, 시간이 되어 스크립트의 두 번째 부분이 실행되면 저장된 파일에서 해당 변수를 읽을 수 있습니다.
답변2
#!/bin/bash
NOW=$(date +"%s")
SOON=$(date +"%s" -d "3:00 PM Sun")
INTERVAL=$(($SOON-$NOW))
sleep $INTERVAL
GNU를 date
사용하면 출력 형식과 표시할 날짜를 지정할 수 있습니다. 그래서 형식 문자열 "%s"를 사용하여 에포크 이후의 시간을 초 단위로 가져오고, 매개변수를 사용하여 임의의 시간에 대해서도 마찬가지입니다 -d
. 차이를 얻으면 잠잘 시간이 있습니다.
과거 날짜를 확인하는 것은 독자의 연습 문제로 남겨집니다.
답변3
이미 제안한 대로 사용해야 할 수도 있지만 at
타이밍 문제를 처리할 때 다음이 도움이 되는 경우가 있습니다. 일부를 요약했지만 링크가 있습니다.
에포크 이후 경과된 시간(초)에 가까운 값입니다. UTC 이름(로 임명에스두번째,쌀몇 분,시간우리의,디매년 1월 1일부터 달력에와이귀 축소 1900)아래 표현식에 따라 에포크 이후의 시간(초)과 관련됩니다.
연도가 1970년 미만이거나 값이 음수이면 관계가 정의되지 않습니다. 연도가 1970보다 크고 값이 음수가 아닌 경우 값은 모든 변수가 정수 유형인 C 언어 표현식에 따라 협정 세계시(UTC) 이름과 연결됩니다.
s + m*60 + h*3600 + d*86400 + (y-70)*31536000 + ((y-69)/4)*86400 - ((y-1)/100)*86400 + ((y+299)/400)*86400
노트:
표현의 마지막 세 용어는 신기원 이후 첫 번째 윤년으로 시작하고 윤년 다음 각 연도에 하루를 추가합니다. 1기는 1973년부터 4년마다 1일씩 늘어났고, 2기는 2001년부터 100년마다 1일씩 줄어들었고, 3기는 2001년부터 400년마다 1일씩 줄어들었다. 공식의 나눗셈은 정수 나눗셈입니다. 즉, 나머지는 버려지고 정수 몫만 남습니다.