
У меня есть минимальный пример моей проблемы, который заключается в попытке установить crontab, который выглядит следующим образом:
FOO="foo\"bar\"bin"
0 0 1 * * ls
запустив crontab crontab
(у меня это в имени файла crontab
). Он вылетает с этой ошибкой:
% crontab crontab
"crontab":0: bad minute
crontab: errors in crontab file, can't install
\"
Проблема в выпавшей кавычке .
Как экранировать кавычки в переменных среды crontab?
Чтобы добавить немного больше контекста, я не просто пишу переменные в вручную написанном crontab. Этот crontab генерируетсяв любое время(Gem Ruby), в нем около 70 записей, и он подбирает все переменные окружения и помещает их как переменные в crontab, чтобы все учетные данные были доступны скриптам. Проблема в том, что недавно я добавил сложный файл с кавычками, и это сломало эту систему.
Если вам интересно, вот код Ruby, который генерирует переменные:
ENV.each do |key, value|
env key.to_sym, value.inspect
end
решение1
Хорошей практикой cron
является:
- Создать скрипт для запуска команд
- Установить переменные в скрипте. Также возможно использование внешнего файла с переменными:
source /path/to/file/with/variables
- Использовать полный путь к командам
/usr/bin/ls
- Не полагайтесь на домашний адрес пользователя, путь и т. д.
А вот пример того, как можно создать один скрипт оболочки, который будет запускать ruby
программу в разных средах.
У cron
вас есть записи типа (пример):
0 1 * * * /path/script 1
0 2 * * * /path/script 2
Сам скрипт выглядит примерно так:
#!/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
и file1
содержат что-то вроде (пример)
RUBYVAR1_1=1
RUBYVAR1_2=2
иfile2
RUBYVAR2_1=12
RUBYVAR2_2=22
решение2
Активная строка в crontab будет либо настройкой среды, либо командой cron. Настройка среды имеет форму,
name = value
где пробелы вокруг знака равенства (=) являются необязательными, и любые последующие не начальные пробелы в значении будут частью значения, назначенного имени. Строка значения может быть заключена в кавычки (одинарные или двойные, но соответствующие) для сохранения начальных или конечных пробелов.
Поэтому заключение строки, содержащей двойные кавычки, в одинарные кавычки должно сработать.
Протестировано с помощью crontab:
var = 'this"contains"quotes'
* * * * * /usr/bin/env >> /tmp/env
Похоже, что это позволит правильно сохранить ваши двойные кавычки в переменной.
cat /tmp/env
HOME=/home/HBruijn
LANG=C.UTF-8
SHELL=/bin/sh
var=this"contains"quotes
Но я также согласен с предыдущим ответом и мнением: cron — это не полноценная среда для написания скриптов, это просто древний планировщик заданий со множеством ограничений, и вам следует выгрузить все, что напоминает сложность, и включить это в само задание.
решение3
Насколько я смог найти, переменные crontab просто не могут иметь кавычек, и они также не могут быть длиннее 999 символов. Ответ на этот вопрос заключается в том, что это просто невозможно.