【问题标题】:Healthcheck shell script: $$? vs $? in elasticsearch docker-compose.yml [duplicate]健康检查 shell 脚本:$$?与美元?在 elasticsearch docker-compose.yml [重复]
【发布时间】:2021-06-25 05:22:21
【问题描述】:

我正在使用 TLS 阅读 Elastic Stack on Docker 上的 elasticsearch 文档。

我在运行状况检查块中遇到了这一行:

curl --cacert $CERT_PATH/ca/ca.crt -s https://localhost:9200 >/dev/null
if [[ $$? == 52 ]]; then
   echo 0
else
   echo 1
fi

脚本使用指定目录下的CA证书来验证对等体。

我知道$? 是最近的前台管道的退出状态(在这种情况下是卷曲)。我的问题是为什么[[...]] 测试命令构造中有 2 个$。我尝试删除 1 $,但随后 Docker 抱怨健康检查选项的插值格式无效...

第一个 $ 是否在 docker-compose 文件中用于某些特定目的,或者 $$? 本身是否是一些特殊的 shell 变量?

在 elastic 的 Github 存储库上链接到完整的 docker-compose.yml。上述行对应链接的 docker-compose.yml 中的第 38 行。

【问题讨论】:

  • 您为什么尝试删除 $ ? docker-compose 执行时会失败吗?
  • 我删除了第一个$ 只是为了看看它是否有效。因为测试是看curl是否返回状态码52。我没有得到的是如果$?表示前一个程序的退出状态为什么脚本使用$$?是的,docker-compose失败当我删除第一个 $ 时开始

标签: linux bash elasticsearch curl docker-compose


【解决方案1】:

我不是 docker 方面的专家,也不是 elasticsearch 方面的专家。 也许这与bash 的关系不如make

要在makefile 中获得$,必须使用额外的$ 对其进行转义。因此,要在 makefile 中获取 $?,您需要 $$?

另一方面,在 bash 中,$$ 为您提供当前进程的 pid,因此也是 bash。

【讨论】:

  • 这似乎很有道理。但是,为什么不 \ 用于转义?另外,当你运行你的makefile时你使用什么shell。您使用[...][[...]] 作为测试构造吗?只是想消除所有其他可能性。
  • 这里没有 Makefile。您可以根据需要使用[[[;见stackoverflow.com/questions/3427872/…
  • 三人组。虽然那里没有 Makefile,但它背后的机制可能是受其启发的。如果您运行这样的脚本,我会尝试坚持使用 POSIX 和 sh
猜你喜欢
  • 1970-01-01
  • 2021-04-20
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多