Linux
為什麼 bash 參數擴展在 systemd 服務文件中不起作用?
我正在嘗試使用
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
.