Tenho um bash
script que preciso poder iniciar a partir de:
cron
- um shell interativo (logon)
Este script precisa saber se foi iniciado a partir de cron
, ou iniciado a partir de um shell interativo. Pensei que tinha resolvido esse problema quando declarei uma variável de ambiente em root crontab
:
RUN_BY_CRON="TRUE"
No script, eu testo RUN_BY_CRON
e uso o resultado para definir outra variável:
if [ "$RUN_BY_CRON" = "TRUE" ]; then
((wait_time=DELAY_HALT*60))
fi
Isso funcionou até eu adicionar set -u
ao meu script (como uma "estratégia de programação defensiva comum" ). Desde então, quando executo o script a partir da linha de comando, set -u
sinaliza RUN_BY_CRON
como um erro de "variável não vinculada":
$ sudo ./skedrtc.sh
./skedrtc.sh: line 24: RUN_BY_CRON: unbound variable
A propósito, executei shellcheck
esse script e não recebi nenhum aviso ou erro.
Tentei adicionar um teste para RUN_BY_CRON
, mas obtive o mesmo erro. Tentei testar para um shell interativo, mas testar de dentro do script em si não é útil:
...
if [ -z "$RUN_BY_CRON" ]; then # test for null string
RUN_BY_CRON="FALSE"
fi
...
if [[ $- == *i* ]]; then # test for interactive shell
RUN_BY_CRON="FALSE"
fi
Isso parece uma situação de "catch 22" . Procurei maneiras de criar um bloco try-catch , mas AIUI não tem nada parecido em bash
.
Potencialmente, você pode usar a
${var-"string"}
sintaxe que significa que se$var
não estiver definido, ele retornará "string", caso contrário, ele retornará$var
por exemplo
Agora, se eu executar isso normalmente:
Então não há erro, e o valor é expandido para um valor "padrão".
Mas se o valor que ele definiu:
Isso funciona mesmo se a variável estiver definida, mas estiver vazia
Se você também quiser substituir a string vazia, use
:-
;Um padrão comum é o código fazer algo como:
no início para garantir que haja um valor padrão definido.