bash – 这个变量如何在systemd单元文件中工作?

前端之家收集整理的这篇文章主要介绍了bash – 这个变量如何在systemd单元文件中工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个相当简单的单元文件,用于我在CoreOS上运行的服务器实例的发现sidekick服务.单元文件如下所示:
[Unit]
Description=Discovery for frontend server (instance %i)
BindsTo=frontend@%i.service
After=frontend@%i.service

[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/bash -c ' \
    while true; do \
        export PORT=$(docker port frontend%i 80 | sed s/.*://); \
        etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:$PORT" --ttl 60; \
        sleep 45; \
    done'
ExecStop=/usr/bin/etcdctl rm /services/frontend/%i

[X-Fleet]
MachineOf=frontend@%i.service

这很好,但是我花了很长时间才进入这个阶段,因为如果我将etcdctl行更改为:

etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; \

然后它不起作用 – 它最终设置一个像100.45.218.3:的值,没有端口.一路上我花了很多时间玩$PORT变量的不同用法,我不知道为什么我选择的配置工作.有一次,我在剧本中有这个:

echo hi $PORT; \
echo "hi $PORT"; \
echo hi ${PORT}; \
echo "hi ${PORT}"; \

得到这样的日志日志:

Aug 17 01:05:07 core-01 bash[53694]: hi 32769
Aug 17 01:05:07 core-01 bash[53694]: hi 32769
Aug 17 01:05:07 core-01 bash[53694]: hi
Aug 17 01:05:07 core-01 bash[53694]: hi

基本上我的问题是:这里发生了什么?面对我理解{}在bash脚本中的工作方式.为什么我可以在COREOS_PRIVATE_IPV4变量上使用curlies(从/ etc / environment导出,但不是PORT?

这在 systemd.service(1)中有记录.${PORT}由systemd扩展.要将$传递给shell,您需要编写$$,所以$${PORT}.重要的是这个:

To pass a literal dollar sign,use “$$”. Variables whose value is not known at expansion time are treated as empty strings.

原文链接:https://www.f2er.com/bash/385755.html

猜你在找的Bash相关文章