No comando não está realmente em execução

3

O código que eu usei para configurar o comando at pode ser encontrado aqui

at -f noti.sh -t ${sleepTimes[$i]}

As horas funcionam corretamente, pois posso ver as tarefas listadas com sucesso com atq .

O arquivo noti.sh está no mesmo diretório onde o comando at está sendo usado e contém:

if [[ "$OSTYPE" == "linux-gnu" ]]; then
    notify-send "Insomnia" "Time to take a rest"  -u critical -t 7000 -i sleep.ico
elif [[ "$OSTYPE" == "darwin"* ]]; then
    terminal-notifier -title "Insomnia" -message "Time to take a rest"  -sound "default"  -group rest -timeout 7 -appIcon sleep.png
fi

O notificador do terminal e o comando notify-send estão instalados nas duas plataformas em que eu testei. Por que a função não será executada da maneira que deveria (mostra uma bolha de notificação)?

    
por A. Epstein 08.05.2017 / 05:23

1 resposta

2

Seu problema pode ser este (de man at ):

DESCRIPTION

at and batch read commands from standard input or a specified file which are to be executed at a later time, using /bin/sh.

Além disso, se você executar, por exemplo, at -f noti.sh -t 2... , deverá enviar um aviso como este:

warning: commands will be executed using /bin/sh
job 4 at Mon May  8 13:51:00 2017

/bin/sh no Debian é um link simbólico para /bin/dash . Eu acho que você testou seu script com bash , que tem alguns recursos não definidos pelo POSIX , ou seja, eles não funcionam em dash ou, em geral, com /bin/sh .

No seu caso específico, os problemas são [[ ]] e OSTYPE , que não são compatíveis com dash . Tente correr

$ sh noti.sh 

Ele retornará o seguinte erro

noti.sh: 2: noti.sh: [[: not found
noti.sh: 4: noti.sh: [[: not found

Considerando que executar o script com bash faz o que você deseja.

Para executar o script como você pretendia, talvez seja necessário reescrevê-lo para ser compatível com /bin/sh ( dash no seu caso), consulte www.shellcheck.net para ajuda com isso.

    
por 08.05.2017 / 14:02