¿Por qué la expansión de parámetros bash no funciona dentro de los archivos de servicio systemd?

14

Estoy tratando de usar systemd's EnvironmentFiley agregar una opción al comando cuando está configurado en el archivo. Tengo lo siguiente en el archivo de la unidad:

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

que no hace eco de nada cuando inicio el servicio.

Lo siguiente funciona como se esperaba:

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

lo que significa que el archivo se lee correctamente.

La sustitución de parámetros también funciona en la línea de comando:

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

¿Qué me estoy perdiendo?

Lev Levitsky
fuente

Respuestas:

27

systemd realiza su propio análisis de línea de comandos minimalista estilo shell del contenido de ExecStart=y otros parámetros. Este análisis minimalista admite la sustitución de variables de entorno básico, pero aparentemente no es así ${PORT:+port is $PORT}.

Deberá evitar que systemd lo haga y dejar que el shell invocado lo maneje.

De la documentación:

Para pasar un signo de dólar literal, use " $$".

Entonces prueba esto:

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

O mejor aún, intente esto:

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

porque el tipo de expansión variable que está haciendo aquí es el estándar POSIX y no es un bash-ism. Al usar en /bin/shlugar de basheliminará una dependencia innecesaria de bash.

Celada
fuente