Dlaczego rozszerzenie parametrów bash nie działa w plikach usług systemowych?

14

Próbuję użyć systemd„s EnvironmentFilei dodać opcję do komendy, gdy jest on ustawiony w pliku. Mam następujące dane w pliku jednostkowym:

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

co nie odbija się echem po uruchomieniu usługi.

Następujące działa zgodnie z oczekiwaniami:

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

co oznacza, że ​​plik został odczytany poprawnie.

Podstawianie parametrów działa również w wierszu poleceń:

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

czego mi brakuje?

Lew Lewicki
źródło

Odpowiedzi:

27

systemd wykonuje własną minimalistyczną analizę wiersza poleceń w stylu powłoki dla zawartości ExecStart=i innych parametrów. To minimalistyczne parsowanie obsługuje podstawianie podstawowych zmiennych środowiskowych, ale najwyraźniej nie jest takie ${PORT:+port is $PORT}.

Będziesz chciał powstrzymać systemd przed zrobieniem tego i pozwól, aby wywołana powłoka sobie z tym poradziła.

Z dokumentacji:

Aby przekazać dosłowny znak dolara, użyj „ $$”.

Spróbuj tego:

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

Lub jeszcze lepiej, spróbuj tego:

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

ponieważ typ rozszerzania zmiennych, który tutaj robisz, jest standardem POSIX i nie jest bash-ism. Używając /bin/shzamiast bashciebie usuniesz niepotrzebną zależność od bash.

Celada
źródło