Как указать системную директиву Environment, содержащую =?

Я хочу указать Environmentsystemd директива, содержащая =например,

Environment=CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

и получите ошибку

[/lib/systemd/system/archiva.service:10] Invalid environment assignment, ignoring: CATALINA_OPTS=-Dappserver.home\=/var/lib/archiva/apache

в journalctl -xe, Я пытался процитировать с " а также ' и убежать = с \ безуспешно. Это кажется недокументированным.

3 ответа

Решение

Я думаю, что ваша проблема связана с пространством в содержимом переменной окружения. Глядя на примеры из документации по systemd, присваивание должно быть одной строкой:

Пример:

Environment="ONE=one" 'TWO=two two'
ExecStart=/bin/echo $ONE $TWO ${TWO}

Это выполнит /bin/echo с четырьмя аргументами: one, two, two, а также two two,

Пример:

Environment=ONE='one' "TWO='two two' too" THREE=
ExecStart=/bin/echo ${ONE} ${TWO} ${THREE}
ExecStart=/bin/echo $ONE $TWO $THREE

Это приводит к тому, что эхо вызывается дважды, первый раз с аргументами 'one', 'two two' too, и второй раз с аргументами one, two two, too,

Я проверил это с помощью следующего сервиса (обратите внимание на кавычки вокруг всего назначения):

[Unit]
Description=My Daemon

[Service]
Environment='CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current'
ExecStart=/bin/echo ${CATALINA_OPTS}

[Install]
WantedBy=multi-user.target

И получил желаемый результат в journalctl:

Apr 26 08:19:29 laptop echo[28439]: -Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

Конечно, было бы проще использовать EnvironmentFile вместо. Замена Environment со следующим дал тот же желаемый результат:

EnvironmentFile=/tmp/foo

куда /tmp/foo содержится (обратите внимание на отсутствие кавычек):

CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

В дополнение к тому, что говорится в принятом ответе, если вы поместите свои переменные среды в раскрывающийся файл, вам нужно использовать следующий синтаксис, чтобы убедиться, что они не все рассматриваются как один аргумент вашей программы:

вставной файл env.conf

      [Service]
Environment='CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current'

блок.сервис

      [Unit]
Description=My Daemon

[Service]
ExecStart=/bin/echo $CATALINA_OPTS

[Install]
WantedBy=multi-user.target

Я не знаю, почему использование только что сработало для меня, а не сработало, и я не смог найти ничего, документирующего эту разницу. Все, что я могу сказать, это то, что синтаксис работал для обработки каждого аргумента в переменной, разделенной пробелом, как отдельных аргументов, тогда как , рассматривал их все как один аргумент.

Возможно, используя это не лучший способ сказать эту разницу. Я предлагаю всем, кто хочет проверить это, использовать что-то вроде против , и посмотрите, что у них получится.


РЕДАКТИРОВАТЬ

Я нашел документацию благодаря другому ответу :

Поддерживается базовая замена переменных среды. Используйте «${FOO}» как часть слова или как собственное слово в командной строке, и в этом случае оно будет стерто и заменено точным значением переменной среды (если есть), включая все пробелы. он содержит, всегда приводя к ровно одному аргументу. Используйте «$FOO» как отдельное слово в командной строке, и в этом случае оно будет заменено значением переменной среды, разделенным пробелом, что приведет к нулю или более аргументам. Для этого типа расширения кавычки учитываются при разбиении на слова, а затем удаляются.

Альтернативное решение

"Экраны C поддерживаются в командных строках и переменных среды"

  • "\ n" новая строка
  • "\ r" возврат каретки
  • вкладка "\ t"
  • "\ v" вертикальная табуляция
  • "\" обратная косая черта
  • "" "двойные кавычки
  • одинарная кавычка "'"
  • пробел "\ s"
  • "\ xxx" номер символа xx в шестнадцатеричной кодировке
  • "\ nnn" номер символа nnn в восьмеричной кодировке

https://www.freedesktop.org/software/systemd/man/systemd.service.html

Другие вопросы по тегам