Por que a expansão de parâmetros bash não funciona nos arquivos de serviço systemd?

14

Estou tentando usar systemd's EnvironmentFilee adicionar uma opção ao comando quando ele estiver definido no arquivo. Eu tenho o seguinte no arquivo da unidade:

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

que não ecoa nada quando inicio o serviço.

O seguinte funciona como esperado:

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

o que significa que o arquivo foi lido corretamente.

A substituição de parâmetro também funciona na linha de comando:

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

o que estou perdendo?

Lev Levitsky
fonte

Respostas:

27

O systemd faz sua própria linha de comando minimalista no estilo de shell, analisando o conteúdo ExecStart=e outros parâmetros. Essa análise minimalista suporta a substituição básica de variáveis ​​de ambiente, mas aparentemente não é assim ${PORT:+port is $PORT}.

Você deseja impedir que o systemd faça isso e deixe que o shell chamado lide com isso.

A partir da documentação:

Para passar um cifrão literal, use " $$".

Então tente o seguinte:

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

Ou melhor ainda, tente o seguinte:

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

porque o tipo de expansão variável que você está fazendo aqui é o padrão POSIX e não é um bash-ism. Ao usar em /bin/shvez de bashvocê removerá uma dependência desnecessária bash.

Celada
fonte