Почему расширение параметров bash не работает внутри служебных файлов systemd?

14

Я пытаюсь использовать systemd«s EnvironmentFileи добавить опцию в команде , когда он установлен в файле. У меня есть следующее в файле модуля:

ExecStart=/usr/bin/bash -c "echo ${PORT:+port is $PORT}"

который ничего не повторяет, когда я запускаю службу.

Следующее работает как ожидалось:

ExecStart=/usr/bin/bash -c "echo port is $PORT"

Это означает, что файл читается правильно.

Подстановка параметров также работает в командной строке:

$ PORT=1234 bash -c 'echo ${PORT:+port is $PORT}'
port is 1234

Что мне не хватает?

Лев Левицкий
источник

Ответы:

27

systemd выполняет собственный минималистический анализ командной строки в стиле оболочки для содержимого ExecStart=и других параметров. Этот минималистический синтаксический анализ поддерживает подстановку переменных базовой среды, но, очевидно, не такие вещи, как ${PORT:+port is $PORT}.

Вы захотите помешать systemd сделать это и позволить вызванной оболочке справиться с этим.

Из документации:

Чтобы передать буквальный знак доллара, используйте « $$».

Так что попробуйте это:

ExecStart=/usr/bin/bash -c "echo $${PORT:+port is $$PORT}"

Или еще лучше, попробуйте это:

ExecStart=/bin/sh -c "echo $${PORT:+port is $$PORT}"

потому что тип расширения переменной, который вы здесь делаете, является стандартом POSIX и не является bash-ism. Используя /bin/shвместо bashвас, вы удалите ненужную зависимость от bash.

Celada
источник