Как добавить переменную окружения с кавычками в crontab?

Как добавить переменную окружения с кавычками в crontab?

У меня есть минимальный пример моей проблемы, который заключается в попытке установить 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является:

  1. Создать скрипт для запуска команд
  2. Установить переменные в скрипте. Также возможно использование внешнего файла с переменными:source /path/to/file/with/variables
  3. Использовать полный путь к командам/usr/bin/ls
  4. Не полагайтесь на домашний адрес пользователя, путь и т. д.

А вот пример того, как можно создать один скрипт оболочки, который будет запускать 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

man 5 crontab

Активная строка в 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 символов. Ответ на этот вопрос заключается в том, что это просто невозможно.

Связанный контент