escapando aspas duplas e sinais de porcentagem (%) no cron

75

O comando a seguir funciona no prompt, mas não no crontab.

 grep abc  /var/log/messages | grep "`date '+%B %d'`" | mail -s"abc log of `hostname`" shantanu.oak+`hostname`@gmail.com

Eu preciso adicioná-lo ao cron diário.

shantanuo
fonte
Seu exemplo é incrível, o% é cercado por aspas duplas, simples e de volta. Não há esperança de que a citação de escape possa funcionar.
tuxayo 26/01

Respostas:

126

Você tem que escapar dos %sinais. Eles têm um significado especial nos crontabs:

man (5) crontab:

Percent-signs (%) in the command, unless escaped with backslash (\), 
will be changed into newline characters, and all data after the 
first % will be sent to the command as standard input.
bmk
fonte
7
+1 Muito interessante, eu também não sabia disso. Surpreso por não ter encontrado isso.
Kyle Smith #
3
Bem, eu acabei de encontrar isso. Eu estava usando date +%Fe não estava chegando a lugar algum #
adamo
2
Essa sintaxe tem algum uso útil? Com SHELL=/bin/bash, eu sempre posso reescrever cat %Hello worldcomo cat <<<'Hello world'. Não vejo a necessidade de sintaxe especial.
Witiko 19/07
@Witiko Se a "sintaxe especial" que você está perguntando é a barra invertida para escapar da porcentagem, a própria pergunta do OP é um exemplo em que é necessária: argumentos de comando que exigem porcentagem, principalmente o programa de datas, que seria bastante popular em um comando crontab. Se você está realmente perguntando por que o cron tem essa pegada em primeiro lugar: ou seja: substitui o avanço de linha no lugar de porcentagem, acho que é para que você possa fornecer, em uma única linha que o crontab exija, um "comando" que consiste em dois ou mais comandos subsidiários.
gwideman
O último. E, como mencionei, pode-se fazer o mesmo com o bash. Não há necessidade de desarrumar a sintaxe de Cron.
Witiko 6/09/19
7

Isso não responde diretamente à sua pergunta, mas eu sugiro que você crie um arquivo de script em / usr / local / bin (ou ~ / bin ou o que for apropriado) e chame isso de cron. É mais fácil testar e editar.

Randy Orrison
fonte
2
Na minha experiência, é muito mais fácil manter 50 linhas em um crontab do que manter 50 arquivos minúsculos. Você deseja transformar scripts mais longos em arquivos de script, com certeza, mas fazê-lo para one-liners pode ser um exagero.
Witiko