以下测试是在CentOS 7.1中进行的.
在/usr/lib / systemd / system /中创建以下文件test.service
[Unit]
Description=Test Bash Brace Expansion
Wants=network.target
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c "a='hello world'; echo ${a}"
[Install]
WantedBy=multi-user.target
并执行systemctl daemon-reload; systemctl重新启动测试; systemctl状态测试-l
没有值的输出,因为${a}不会替代为hello world一词,直到将其更改后将${a}更改为
> echo $a:工作
> echo $${a}:工作
“ $$”表示猛烈地执行该过程,但是为什么“ $$”可以在ExecStart中完成技巧以得到“ hello world”一词?
解决方法:
括号与参数扩展
您要做的不是括号扩展,而是参数扩展.括号扩展(例如${1..5}在双引号内不起作用.
您的问题通过两个Bash Shell进行了解释
参数扩展确实在双引号内起作用,但是如果替换应在被调用的shell中而不是在当前的shell中进行,则需要用$符号引起来.
考虑以下示例:
a='bye world' ; /bin/bash -c "a='hello world'; echo ${a}"
bye world
与这个:
a='bye world' ; /bin/bash -c "a='hello world'; echo \${a}"
hello world
重要的是要记住,您的systemd服务描述文件不是在Bash中执行的(如上述示例所示),因此有一些非常相似但略有不同的规则,请参见documentation for service unit configuration files.
您的问题是,像上面第一个示例中的交互式Bash一样,systemd试图扩展${a},它在其环境中没有.正如您已经注意到的,$$是您的解决方案,上面的链接说明了原因:
To pass a literal dollar sign, use “$$”.
这允许参数扩展发生在Bash shell systemd正在调用中.因此,配置文件中的行应显示为:
ExecStart=/bin/bash -c "a='hello world'; echo $${a}"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。