"at" 명령을 사용하세요

"at" 명령을 사용하세요

내 스크립트 출력의 이 부분

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

  1. at시간 사양이 깨졌습니다. 즉, 시스템이 인식하는 형식이 아닙니다.
  2. 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호출해야 합니다 .bashjob.shbash


코드 이식성 팁:

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.

관련 정보