Por que a expansão do parâmetro bash não funciona dentro dos arquivos do serviço systemd?

13

Estou tentando usar systemd do EnvironmentFile e adicionar uma opção ao comando quando ele estiver definido no arquivo. Eu tenho o seguinte no arquivo de unidade:

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

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

Os seguintes trabalhos funcionam como esperado:

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

que significa que o arquivo é lido corretamente.

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

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

O que estou perdendo?

    
por Lev Levitsky 17.07.2015 / 18:00

1 resposta

24

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

Você vai querer evitar que o systemd faça isso e deixe o shell chamado manipulá-lo.

Da documentação:

To pass a literal dollar sign, use "$$".

Então tente isto:

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

Ou melhor ainda, tente isto:

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

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

    
por 17.07.2015 / 18:17