我有一个相当简单的单元文件,用于我在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}.重要的是这个:
原文链接:https://www.f2er.com/bash/385755.htmlTo pass a literal dollar sign,use “$$”. Variables whose value is not known at expansion time are treated as empty strings.