No Ubuntu 16.04 Bash 4.3.46(1) no final de /etc/bash.bashrc
declarei a seguinte variável:
drt="/var/www/html"
Eu criei o arquivo ( source /etc/bash.bashrc
)
Eu executei crontab -e
e adicionei apenas para teste * * * * * touch /var/www/html/myFile.sh
. Isso funcionou, enquanto * * * * * touch ${drt}/myFile.sh
não funcionou.
Se uma variável declarada em bash.bashrc
for global, por que ela não é processada por crontab
?
Atualização1
Não quero duplicar o fluxo drt="/var/www/html"
em crontab
(ou cron.d
) para evitar redundância por princípio.
Atualização2
Acompanhei esta sessão e parece que a resposta marcada como correta não resolveu meu problema.
A segunda resposta não ficou clara para mim - por que colocar essa declaração condicional em (alguns?) bashrc
Arquivo.
Eu também tentei a terceira solução em relação a bash.bashrc
(adicionado SHELL=/bin/bash
no início de crontab
, salvei o arquivo e originei, bash.bashrc
mas não alterei em um * * * * * touch ~/myfiile
teste.
Peço assim reabrir esta questão, ou pelo menos, esclarecer uma das respostas aí existentes.
As variáveis definidas em
*.bashrc
são globais apenas no sentido de que podem ser lidas por programas em execução no shell e são manipuladas especialmente pelo shell. Se um programa lê essas variáveis ambientais e como elas as interpretam depende completamente do projeto e não há regulamentação declarando como um programa deve lidar com as variáveis ambientais.Resumindo, a forma como
cron
interpreta o crontab é decidida pelocron
próprio programa. Ele decide não ler as variáveis de ambiente "globais" e usar sua própria sintaxe para definir as "variáveis de ambiente". Isso é intencional. Se você pode entender por que não podemos simplesmente usar${drt}
em umCMakeLists.txt
, você deve ser capaz de entender por que${drt}
um crontab não faz o que você espera que ele faça.Você pode, é claro, adicionar a seguinte linha ao seu crontab , se desejar.