为什么bash参数扩展在systemd服务文件中不起作用?


14

我正在尝试使用systemd的,EnvironmentFile并在文件中设置命令时向命令添加选项。我在单位文件中具有以下内容:

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

当我启动服务时,它什么也没有回应。

预期的工作如下:

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

这表示文件已正确读取。

参数替换也可以在命令行上使用:

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

我想念什么?

Answers:


27

systemd对其内容ExecStart=和其他参数进行自己的简约外壳式命令行解析。这种简约的分析支持基本的环境变量替换,但显然不支持${PORT:+port is $PORT}

您将要阻止systemd这样做,并让调用的shell处理它。

从文档中:

要传递文字美元符号,请使用“ $$”。

所以试试这个:

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

还是更好,请尝试以下操作:

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

因为您在这里执行的变量扩展类型是POSIX标准,而不是bash-ism。通过使用/bin/sh代替,bash您将消除对不必要的依赖bash

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.