Eu tenho os seguintes trabalhos cron definidos.
55 8 * * 3 /usr/bin/php /home/mark/dev/processes/customClient/events.php > /home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv
0 9 * * 3 /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s 'Events from `date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`' -a '/home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv'
Parece funcionar corretamente se eu executar o comando acima diretamente da linha de comando. Mas, quando verifiquei a execução do script hoje de manhã, recebi um e-mail informando (estou parafraseando porque os excluí acidentalmente) que os tiques anteriores não estavam fechados corretamente.
command-line
cron
Mark D
fonte
fonte
/bin/sh: 1: Syntax error: EOF in backquote substitution
Para o primeiro trabalho cron./bin/sh: 1: Syntax error: Unterminated quoted string
Para o segundo trabalho cron.$(...)
o ajudará a lidar com as questões citando ...Respostas:
Eu recomendo colocar todos os trabalhos cron não triviais em seu próprio arquivo de script de shell, por vários motivos:
fonte
%
caracteres problemáticos no script impedirácron
que eles sejam transformados em novas linhas, que é o seu problema real.Existem três causas comuns para os comandos do cron job se comportarem de maneira diferente em comparação aos comandos digitados diretamente em um shell interativo, em ordem aproximada de semelhança:
$PATH
e outras variáveis esperadas ausentes./bin/sh
por padrão, enquanto você pode estar usando algum outro shell interativamente.%
personagem especialmente (ele é transformado em uma nova linha no comando).Você deve preceder todos os
%
caracteres com a\
em um arquivo crontab, o que instrui o cron a colocar apenas uma porcentagem no comando. Lembre-se de que quando você usa odate
comando em um trabalho cron.Também corrigi alguns problemas de cotação:
$(…)
vez disso, use : suas regras de análise são mais simples."$somevariable"
,"$(somecommand)"
. Aqui, a falta de aspas é inofensiva porque odate
comando nunca retornou nenhum caractere especial para os formatos usados, mas você deve se lembrar cuidadosamente de quais caracteres são especiais e verificar isso toda vez que deixar uma substituição sem aspas. Mantenha a simplicidade, sempre use aspas duplas, a menos que você queira que a divisão de campos e a geração de nome de arquivo ocorram no resultado.fonte
Você parece ter aninhado
'
nomutt
comando:Tente usar em
"
vez do interno'
para que a instrução leiafonte