Seu comando
at -f ${sleepTimes[$i]} showRestNotification
instrui at a executar ${sleepTimes[$i]} no tempo showRestNotification .
- A especificação de horário é ilegível, ou seja, não está em um formato reconhecível por
atem seu sistema. -
atlê 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.