내 스크립트 출력의 이 부분
at: garbled time
루프의 각 인덱스에 대해 showRestNotification
이 호출 전에 정의된 함수는 어디에 있습니까?
for i in {0..5}
do
at ${sleepTimes[$i]} -f showRestNotification
done
주어진 곳에
echo ${sleepTimes[0]}
출력은 다음과 같습니다.
05/06/17 19:15
at 명령과 함께 사용할 수 있도록 변수의 형식을 다시 지정하려면 어떻게 해야 합니까? 그러나 날짜는 내 스크립트의 기능에 매우 중요하므로 그대로 두어야 합니다.
편집하다:
수면 시간 기능
generateSleepTimes()
{
oldIFS=$IFS
IFS=: splitTime=(${wakeUpTime##*-})
wakeUpHours=${splitTime[0]}
wakeUpMinutes=${splitTime[1]}
if [[ "$OSTYPE" == "linux-gnu" ]]; then
currentHours=$(date +'%H')
currentMinutes=$(date +'%M')
elif [[ "$OSTYPE" == "darwin"* ]]; then
currentHours=$(gdate +'%H')
currentMinutes=$(gdate +'%M')
fi
if [[ $wakeUpHours -lt $currentHours ]]; then
IFS=$oldIFS
wakeUpTime="$wakeUpTime tomorrow"
elif [[ $wakeUpHours -eq $currentHours && $wakeUpMinutes -lt $currentMinutes ]]; then
IFS=$oldIFS
wakeUpTime="$wakeUpTime tomorrow"
else
IFS=$oldIFS
wakeUpTime="$wakeUpTime today"
fi
if [[ "$OSTYPE" == "linux-gnu" ]]; then
tempTime=$(date -d "$wakeUpTime - 15 minutes" +"%D %H:%M")
elif [[ "$OSTYPE" == "darwin"* ]]; then
tempTime=$(gdate -d "$wakeUpTime - 15 minutes" +"%D %H:%M")
fi
if [[ "$OSTYPE" == "linux-gnu" ]]; then
sleepTimes[6]=$(date -d "$tempTime" +"%D %H:%M")
elif [[ "$OSTYPE" == "darwin"* ]]; then
sleepTimes[6]=$(gdate -d "$tempTime" +"%D %H:%M")
fi
for i in {5..0}
do
if [[ "$OSTYPE" == "linux-gnu" ]]; then
sleepTimes[$i]=$(date -d "${sleepTimes[$i+1]} - 1 hour" +"%D %H:%M")
elif [[ "$OSTYPE" == "darwin"* ]]; then
sleepTimes[$i]=$(gdate -d "${sleepTimes[$i+1]} - 1 hour" +"%D %H:%M")
fi
done
echo "${sleepTimes[@]}"
}
답변1
주문
at -f ${sleepTimes[$i]} showRestNotification
지침은 at
정시에 실행됩니다.${sleepTimes[$i]}
showRestNotification
at
시간 사양이 깨졌습니다. 즉, 시스템이 인식하는 형식이 아닙니다.at
-f
표준 입력(또는 사용 시 파일)에서 읽습니다.
at
시간 사양이 어떤 형식이어야 하는지 이해하려면 시스템의 설명서를 읽어야 합니다 . 내 시스템(Linux 아님)에서는 2017년 5월 6일 19:15 [[cc]yy]mmddHHMM[.SS]
형식 이어야 한다고 나와 있습니다 .201705061915
또한 실행할 명령은 at
표준 입력(또는 사용되는 경우 파일 -f
)에서 읽혀지므로 실행할 함수의 정의와 이에 대한 올바른 호출이 포함된 셸 스크립트를 제공해야 합니다. 예:
#/bin/sh
# this is "job.sh"
showRestNotification () {
# ...
}
showRestNotification
그 다음에,
at -f job.sh -t 201705061915
또는
at 201705061915 <job.sh
지정된 파일이 실행 되므로 at
특정 쉘 구성을 사용하려면 함수 정의 및 호출이 포함된 스크립트를 /bin/sh
호출해야 합니다 .bash
job.sh
bash
코드 이식성 팁:
date () {
case "$OSTYPE" in
darwin*) command gdate "$@" ;;
linux*) command date "$@" ;;
*) printf 'Unsupported OS type: %s\n' "$OSTYPE" >&2
exit 1 ;;
esac
}
그럼 그냥 사용
sleepTimes[$i]="$(date -d "${sleepTimes[$i+1]} - 1 hour" +"%Y%m%d%H%M")"
어디서나 테스트할 필요가 없습니다 $OSTYPE
.