Linux

為什麼 bash 參數擴展在 systemd 服務文件中不起作用?

  • August 19, 2015

我正在嘗試使用systemd’sEnvironmentFile並在文件中設置命令時添加一個選項。我在單元文件中有以下內容:

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

我錯過了什麼?

systemd對內容ExecStart=和其他參數進行自己的簡約 shell 風格的命令行解析。這種簡約的解析支持基本的環境變數替換,但顯然不支持${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 主義。通過使用/bin/sh而不是bash你將消除對bash.

引用自:https://unix.stackexchange.com/questions/216780