Pourquoi l'expansion des paramètres bash ne fonctionne-t-elle pas dans les fichiers de service systemd?

14

J'essaie d'utiliser systemd's EnvironmentFileet d'ajouter une option à la commande lorsqu'elle est définie dans le fichier. J'ai les éléments suivants dans le fichier d'unité:

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

qui ne fait écho à rien lorsque je démarre le service.

Les travaux suivants fonctionnent comme prévu:

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

ce qui signifie que le fichier est lu correctement.

La substitution de paramètres fonctionne également en ligne de commande:

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

Qu'est-ce que je rate?

Lev Levitsky
la source

Réponses:

27

systemd fait sa propre analyse de ligne de commande de style shell minimaliste du contenu deExecStart= et d'autres paramètres. Cette analyse minimaliste prend en charge la substitution de variable d'environnement de base, mais apparemment pas des choses comme ${PORT:+port is $PORT}.

Vous voudrez empêcher systemd de faire cela et laisser le shell appelé le gérer.

De la documentation:

Pour passer un signe dollar littéral, utilisez " $$".

Essayez donc ceci:

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

Ou mieux encore, essayez ceci:

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

car le type d'extension variable que vous faites ici est standard POSIX et n'est pas un bash-ism. En utilisant /bin/shau lieu de bashvous supprimerez une dépendance inutile bash.

Celada
la source