저는 GNU date 명령을 사용하여 임의의 자연어 날짜를 구문 분석합니다. 예를 들어 특정 시대의 타임스탬프가 지난 주의 것인지 감지하려면 다음을 수행합니다.
if [ "$timestamp" -lt "$(date +"%s" -d "last sunday")" ]; then ...
이제 스크립트를 FreeBSD로 포팅하려고 할 때 어떻게 동일한 기능을 얻을 수 있습니까? man date
내가 뭔가 분명한 것을 놓치고 있지 않는 한 어떤 약속도 보여주지 않습니다.
답변1
많이있다FreeBSD의 명령은 GNU와 동일한 API를 사용하여 date
사용자의 자연어 날짜를 입력합니다.. 방금 해당 날짜를 Unix 시대 시간으로 변환하도록 속일 수 있는 방법을 발견했습니다.
/usr/sbin/fifolog_reader -B 'last sunday' /dev/null 2>&1 |
sed 's/^From[[:blank:]]*\([0-9]*\).*/\1/p'
(적어도 제가 시도한 FreeBSD 9.1-RELEASE-p2에서는 UTC 시간대에 있고 인식하는 날짜 사양이 GNU에서 인식하는 날짜 사양과 반드시 동일하지는 않을 경우에만 안정적으로 작동하는 것 같습니다. 날짜).
일부 쉘에는 이 기능이 내장되어 있습니다.
ksh93
:
if (( timestamp < $(printf '%(%s)T' 'last sunday') )); then
zsh
:
autoload calendar_scandate
calendar_scandate 'last sun'
if (( timestamp < REPLY)); then...
또는 설치된 경우 perl
다음을 사용할 수 있습니다 .Date::Manip
last_sun=$(perl -MDate::Manip -e 'print UnixDate("last sunday","%s")')
if [ "$timestamp" -lt "$last_sun" ]; then...
또는:
if perl -MDate::Manip -e 'exit 1 unless $ARGV[0] < UnixDate("last sunday","%s")
' "$timestamp"; then....
파일 타임스탬프를 확인하는 것이 목적이라면 FreeBSD는 다음을 find
지원한다는 점에 유의하세요.
find file -prune -newermt 'last sunday'
이 경우 이번 주의 시작(일요일부터 시작하는 주)을 원하는 경우 다음을 수행할 수 있습니다.
week_start=$(($(date '+%s - 86400*%w - 3600*%H - 60*%M - %S')))
이는 GNU 및 FreeBSD(또는 지원되는 시스템)에서 작동합니다 %s
.
일광 절약 시간을 사용하는 시간대에서는 일광 절약 시간 전환 전후에 1시간의 지연이 있습니다.
답변2
아마도 호환성을 보장하는 가장 좋은 방법은 FreeBSD 시스템에 GNU 날짜를 설치하는 것입니다.
coreutils
FreeBSD 포트 컬렉션에서 이 패키지를 설치할 수 있습니다 . 그러면 GNU date 명령이 /usr/local/bin/gdate
.
답변3
자연어로 쉽게 표현할 수 있는 모든 작업에 대해 작동하지 않을 수 있지만 FreeBSD에는 개별 날짜 필드에 대해 임의 및 상대 값을 설정할 수 있는 연산자가 date
있으며 -v
이 작업은 필요에 따라 반복하여 대부분의 효과를 생성할 수 있습니다.
예를 들어 마지막 일요일을 얻으려면 다음과 같이 전체 시간 필드 0을 적용한 다음 평일 0을 적용합니다.
date -v0S -v0M -v0H -v0w
따라서 Bash에서 "Linux에서 실행하든 BSD에서 실행하든 지난 일요일 이후의 초 수를 알려주세요"는 다음과 같습니다.
last_sunday_start() {
if [ "$(uname)" = "Linux" ]; then
date +"%s" -d "next sunday -1 week"
else
date -v0S -v0M -v0H -v0w +"%s"
fi
}
date
"일요일에 00:00:00이 발생한 마지막 시간"을 얻으려는 경우 질문의 GNU 예제는 올바르지 않습니다. 일요일에 호출하면 이전 일요일의 시작 시간이 반환됩니다. 위의 코드는 GNU 날짜/시간 사양도 수정합니다.