如何解决systemd服务ExecStart中$(uname -r)参数传递异常问题
问题原因
systemd的ExecStart指令默认不会启动shell环境执行命令,仅会按空格对输入内容做参数分割,shell特有的命令替换语法$()无法被识别解析,空格会被直接当作参数分隔符,因此$(uname -r)会被拆分为$(uname和-r)两个独立参数,不符合预期。
单行配置解决方案
要在不调整脚本逻辑的前提下直接在ExecStart行实现需求,只需显式调用shell执行目标命令,将完整的执行逻辑作为参数传入shell即可。修改后的配置如下:
[Unit] Description=Check kernel version [Service] ExecStart=bash -c '/home/handle-kernel-version.sh "$EXPECTED_KERNEL" "$(uname -r)"' StandardOutput=journal+console EnvironmentFile=/home/input_kernel.txt Type=oneshot [Install] WantedBy=multi-user.target
配置说明
- 用
bash -c包裹全部执行逻辑,由shell负责解析变量和命令替换语法,符合预期执行流程 - 命令内部的变量、命令替换外层添加双引号,可避免返回结果带特殊字符、空格时出现参数拆分异常
- 原有
EnvironmentFile定义的环境变量可被shell正常读取,无需额外调整其他配置项
内容的提问来源于stack exchange,提问作者EagleOne
相关产品推荐
相关产品推荐

