Perché l'espansione dei parametri bash non funziona all'interno dei file di servizio systemd?


14

Sto provando a usare quello systemddi EnvironmentFilee aggiungere un'opzione al comando quando è impostato nel file. Ho il seguente nel file di unità:

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

che non fa eco a nulla quando avvio il servizio.

Quanto segue funziona come previsto:

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

il che significa che il file viene letto correttamente.

La sostituzione dei parametri funziona anche sulla riga di comando:

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

Cosa mi sto perdendo?

Risposte:


27

systemd esegue l'analisi della riga di comando in stile shell minimalista del contenuto ExecStart=e di altri parametri. Questo analisi minimalista supporta la sostituzione delle variabili d'ambiente di base ma apparentemente non cose del genere ${PORT:+port is $PORT}.

Dovrai impedire a systemd di farlo e lasciare che la shell invocata lo gestisca.

Dalla documentazione:

Per passare un segno di dollaro letterale, usa " $$".

Quindi prova questo:

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

O meglio ancora, prova questo:

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

perché il tipo di espansione variabile che stai facendo qui è standard POSIX e non è un bash-ism. Usando /bin/shinvece di bashte rimuoverai una dipendenza non necessaria da bash.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.