Warum funktioniert die Bash-Parameter-Erweiterung in Systemd-Servicedateien nicht?

14

Ich versuche, systemd's zu verwenden EnvironmentFileund dem Befehl eine Option hinzuzufügen, wenn er in der Datei festgelegt ist. Ich habe folgendes in der Unit-Datei:

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

was nichts wiedergibt, wenn ich den Dienst starte.

Folgendes funktioniert wie erwartet:

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

was bedeutet, dass die Datei korrekt gelesen wird.

Die Parameterersetzung funktioniert auch in der Befehlszeile:

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

Was vermisse ich?

Lev Levitsky
quelle

Antworten:

27

systemd führt eine eigene minimalistische Befehlszeilenanalyse im Shell-Stil durch, die den Inhalt ExecStart=und andere Parameter analysiert . Diese minimalistische Analyse unterstützt die einfache Substitution von Umgebungsvariablen, aber anscheinend nicht solche ${PORT:+port is $PORT}.

Sie möchten verhindern, dass systemd dies tut, und die aufgerufene Shell wird damit umgehen.

Aus der Dokumentation:

Verwenden Sie " $$", um ein buchstäbliches Dollarzeichen zu übergeben .

Also versuche folgendes:

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

Oder noch besser, versuchen Sie Folgendes:

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

da die Art der Variablenerweiterung, die Sie hier ausführen, POSIX-Standard ist und keine Bash-ismus ist. Durch die Verwendung von /bin/shanstelle von bashentfernen Sie eine unnötige Abhängigkeit von bash.

Celada
quelle