systemd环境变量多词展开不符合手册预期问题咨询
问题原因与解决方法
核心问题:未遵循systemd变量展开的语法要求
你遇到的问题不是换行导致的bug,而是没有按照systemd手册指定的语法触发参数拆分,再加上systemd 228版本的行为限制:
- 手册规则的关键点:手册明确要求,必须使用带双引号的
"$FOO"形式作为单独的命令行词,才会将变量值按空格拆分为多个参数。你当前使用的$CHECK_SELECTION或${CHECK_SELECTION}都是无引号形式,不符合触发拆分的条件。 - systemd 228的版本特性:
- 使用
$CHECK_SELECTION时,老版本systemd未正确识别无花括号的变量展开,直接将$CHECK_SELECTION字符串原样作为参数传递给程序; - 使用
${CHECK_SELECTION}时,变量会被展开,但因为没有双引号,systemd会将整个变量值作为单个参数传递,不会拆分空格。
- 使用
修正后的ExecStart配置
将${CHECK_SELECTION}改为带双引号的"$CHECK_SELECTION",其他需要拆分参数的变量也同理处理:
ExecStart=/usr/bin/my-prog \ --many-more-options \ "$CHECK_SELECTION" --notification-template="${NOTIFICATION_TEMPLATE}" \ "$OTHER_OPTIONS"
注意:
--notification-template=${NOTIFICATION_TEMPLATE}不需要拆分参数,所以可以保留无引号形式(或加上引号也不影响),但需要拆分的变量必须用"$VAR"格式。
补充说明
systemd的变量展开行为在后续版本中(如230+)有优化,但对于228这类老版本,严格遵循手册的双引号语法是触发参数拆分的唯一方式。换行和反斜杠的使用没有问题,systemd会自动合并反斜杠连接的多行内容。
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

