将systemctl命令赋值给bash变量时报systemd-escape错误如何解决
问题原因
你当前的写法只是将命令字符串赋值给了变量,并没有实际执行命令。当你后续直接调用$status运行时,systemctl会把管道符、grep、sed等后续所有参数都当作systemd单元名称解析,因此会抛出找不到对应服务/挂载单元的错误。
解决方案
要将命令执行结果存入bash变量,需要使用命令替换语法,用$()包裹需要执行的命令即可。
方法1:直接修正原写法
status=$(systemctl status syslog-ng | grep 'Active:' | sed 's/.*: //' | sed 's/since.*//g')
执行后$status的值就是你要提取的active (running)这类状态内容。
方法2:简化写法(减少管道开销)
可以直接用sed单次处理完成匹配和提取,不需要额外调用grep:
status=$(systemctl status syslog-ng | sed -n '/Active:/ s/.*: \(.*\) since.*/\1/p')
方法3:更稳定的原生方案(推荐用于脚本)
systemd自带了查询服务运行状态的专用子命令is-active,不需要解析格式化输出,结果更稳定可靠:
status=$(systemctl is-active syslog-ng)
该命令会直接返回active/inactive/failed等标准状态值,适配所有systemd发行版,不会因为systemctl status的输出格式更新而失效。
内容的提问来源于stack exchange,提问作者caesim
相关产品推荐
相关产品推荐

