Usando o comando 'at'

0

Esta parte do meu script é exibida

at: garbled time 

para todos os índices no loop, em que showRestNotification é uma função definida anteriormente a essa chamada

for i in {0..5}
 do
  at ${sleepTimes[$i]} -f showRestNotification 
done

onde é dado

echo ${sleepTimes[0]}

a saída é semelhante a

05/06/17 19:15

Como posso reformatar minha variável para que ela funcione com o comando at? Eu preciso da data para ficar no entanto, pois é imperativo para a função do meu script.

Editar:

função sleepTimes

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[@]}"
}
    
por A. Epstein 07.05.2017 / 08:25

1 resposta

2

Seu comando

at -f ${sleepTimes[$i]} showRestNotification 

instrui at a executar ${sleepTimes[$i]} no tempo showRestNotification .

  1. A especificação de horário é ilegível, ou seja, não está em um formato reconhecível por at em seu sistema.
  2. at lê a entrada padrão (ou de um arquivo quando -f é usado).

Você precisará ler a documentação do at em seu sistema para ver em qual formato a especificação de tempo precisa estar. No meu sistema (não no Linux), ele diz que deve estar no formato [[cc]yy]mmddHHMM[.SS] , ou seja 201705061915 para 19:15 a 6 de maio de 2017.

Além disso, como at lê os comandos para executar a partir da entrada padrão (ou de um arquivo quando -f é usado), você precisará fornecer um script de shell que contenha a definição da função que deseja executar, juntamente com a chamada correta para ele, por exemplo:

#/bin/sh

# this is "job.sh"

showRestNotification () {
    # ...
}

showRestNotification

Então,

at -f job.sh -t 201705061915

ou

at 201705061915 <job.sh

Como at executará o arquivo especificado usando /bin/sh , será necessário invocar um script bash contendo a definição da função e a invocação de job.sh se você desejar usar as construções de shell bash -specific.

Uma sugestão de portabilidade para o seu código:

date () {
    case "$OSTYPE" in
      darwin*) command gdate "$@" ;;
      linux*)  command date  "$@" ;;
      *) printf 'Unsupported OS type: %s\n' "$OSTYPE" >&2
         exit 1 ;;
     esac
}

Depois é só usar

sleepTimes[$i]="$(date -d "${sleepTimes[$i+1]} - 1 hour" +"%Y%m%d%H%M")"

sem ter que testar $OSTYPE em todo o lugar.

    
por 07.05.2017 / 08:44