
Eu tenho um exemplo mínimo do meu problema, que é tentar instalar um crontab parecido com este:
FOO="foo\"bar\"bin"
0 0 1 * * ls
executando crontab crontab
(eu tenho isso em um nome de arquivo crontab
). Ele falha com este erro:
% crontab crontab
"crontab":0: bad minute
crontab: errors in crontab file, can't install
É a citação escapada, \"
, causando o problema.
Como faço para escapar das aspas nas variáveis de ambiente do crontab.
Para adicionar um pouco mais de contexto, não estou apenas escrevendo variáveis em um crontab escrito manualmente. Este crontab é gerado porem qualquer momento(uma gem Ruby), possui cerca de 70 entradas e pega todas as variáveis de ambiente e as coloca como variáveis no crontab para que todas as credenciais estejam disponíveis para os scripts. O problema é que recentemente adicionei um complexo que contém aspas e que quebrou esse sistema.
Caso você esteja curioso, o código Ruby que gera as variáveis é:
ENV.each do |key, value|
env key.to_sym, value.inspect
end
Responder1
A boa prática para cron
é:
- Crie um script para executar os comandos
- Defina variáveis no script. Também é possível usar arquivo externo com variáveis:
source /path/to/file/with/variables
- Use o caminho completo para comandos
/usr/bin/ls
- Não confie na casa do usuário, caminho, etc.
E aqui está um exemplo de como você pode criar um script de shell que executa ruby
programas em diferentes ambientes.
Em cron
você tem registros como (exemplo):
0 1 * * * /path/script 1
0 2 * * * /path/script 2
O script em si é algo como:
#!/bin/bash
a=$1
case "$a" in
1) source /path/file1
/path/to/ruby <parameters>
;;
2) source /path/file2
/path/to/ruby <parameters>
;;
<snip>
*) # do something if parameter is not enumerated
;;
esac
e file1
contém algo como (exemplo)
RUBYVAR1_1=1
RUBYVAR1_2=2
efile2
RUBYVAR2_1=12
RUBYVAR2_2=22
Responder2
Uma linha ativa em um crontab será uma configuração de ambiente ou um comando cron. Uma configuração de ambiente tem a forma,
name = value
onde os espaços ao redor do sinal de igual (=) são opcionais e quaisquer espaços não iniciais subsequentes em valor farão parte do valor atribuído ao nome. A string de valor pode ser colocada entre aspas (simples ou duplas, mas correspondentes) para preservar os espaços em branco à esquerda ou à direita.
Portanto, colocar sua string contendo aspas duplas com aspas simples deve funcionar
Testado com um crontab:
var = 'this"contains"quotes'
* * * * * /usr/bin/env >> /tmp/env
Parece que armazenará corretamente suas aspas duplas na var.
cat /tmp/env
HOME=/home/HBruijn
LANG=C.UTF-8
SHELL=/bin/sh
var=this"contains"quotes
Mas também concordo com a resposta e o sentimento anteriores; cron não é um ambiente de script adequado, é apenas um agendador de tarefas antigo com muitas limitações e você deve descarregar qualquer coisa que se assemelhe à complexidade e incluí-la no próprio trabalho.
Responder3
Pelo que pude descobrir, as variáveis crontab simplesmente não podem ter aspas e também não podem ter mais de 999 caracteres. A resposta a esta pergunta é que simplesmente não é possível.