gpt4 book ai didi

linux - Systemd ExecStart 中的 Bash 大括号扩展

转载 作者:太空狗 更新时间:2023-10-29 11:03:58 25 4
gpt4 key购买 nike

以下测试在CentOS 7.1下进行。

创建以下文件 test.service/usr/lib/systemd/system/

[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 restart test; systemctl status test -l

没有输出值作为${a}不替代单词 hello world , 直到它被改变 echo ${a}进入

  1. echo $a : 工作
  2. echo $${a} : 工作

$$表示 bash 中进程的 pid,但为什么 $$ 可以在 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 服务文件以及为什么 `$$` 有效

重要的是要记住您的 systemd 服务描述文件不是在 Bash 中执行的(如上面的示例),因此有一些非常相似但略有不同的规则,请参阅 documentation for service unit configuration files .

您的问题是,就像上面第一个示例中的交互式 Bash 一样,systemd 正在尝试扩展其环境中没有的 ${a}。正如您已经注意到的,$$ 是您的解决方案,上面的链接解释了原因:

To pass a literal dollar sign, use "$$".

这允许在 systemd 调用的 Bash shell 中进行参数扩展。所以配置文件中的行应该是:

ExecStart=/bin/bash -c "a='hello world'; echo $${a}"

关于linux - Systemd ExecStart 中的 Bash 大括号扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33097284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com