Чому розширення параметра bash не працює в файлах системних служб?


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 і не є базовим. Використовуючи /bin/shзамість bashвас, ви усунете зайву залежність від bash.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.