我在使用 systemd 的环境文件时遇到问题: 定义一个变量,如
#... many more
CHECK_SELECTION=--no-check-a --no-check-b --no-check-c
#... many more
在
systemd
单元的环境文件中,我遇到问题:
$CHECK_SELECTION
时,它会在systemd 228中逐字传递${CHECK_SELECTION}
时,这三个单词将作为 one 参数传递,导致语法错误。手册页
systemd.service(5)
但是声称它应该可以工作(正如我所读的):
Use "$FOO" as a separate word on the command line, in which case it
will be replaced by the value of the environment variable split at
whitespace, resulting in zero or more arguments. For this type of
expansion, quotes are respected when splitting into words, and
afterwards removed.
我的
ExecStart
看起来像这样:
ExecStart=/usr/bin/my-prog \
--many-more-options \
${CHECK_SELECTION} --notification-template=${NOTIFICATION_TEMPLATE} \
${OTHER_OPTIONS}
那么到底出了什么问题呢? 难道我在
systemd
中发现了一个错误(因为空格来自续行)?
问题已解决(实际上是由用户困惑引起的):
我开始对像
$VAR
这样的选项使用 --option=$VAR
语法,当意识到该值未被替换(并且程序因语法错误而中止)时,我用 ${VAR}
替换了 all变量出现。
但是根据文档
${VAR}
不会拆分单词。
因此,解决方案是在
和周围没有空格且不需要或不希望进行分词的情况下使用
${VAR}
,在需要分词的情况下使用 $VAR
(并且周围有空格以启用替换) ).