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?

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.