docker-compose.yaml 中“等待 $${!}”的含义?

Spi*_*rit 1 shell quoting docker yaml

我正在用letsencrypt和nginx做一些docker。在我遵循的教程中,有一个用于 certbot 容器的命令,它允许每 12 小时检查一次证书的有效性。

/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'
Run Code Online (Sandbox Code Playgroud)

我做 bash 已经有一段时间了,但wait $${!}直到今天我还从未见过这样的事情?是什么$${!}意思?

编辑: 该命令是 docker-compose.yaml 的一部分,所以完整的命令是:

entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

Kus*_*nda 6

在 使用的 YAML 文件中docker-compose,单个文字$必须写为$$. $运行命令时,双美元符号将替换为单个美元符号,这使得 shell 命令使用${!}(与 相同$!,即最近启动的后台作业的进程 ID)。

$$语法记录在这里

$$当您的配置需要文字美元符号时,您可以使用(双美元符号)。这也可以防止 Compose 插入值,因此 a$$允许您引用不想由 Compose 处理的环境变量。

这一点与bash. 这只是关于 Compose 如何处理 YAML 文档。


请注意,使用后台作业wait是完全没有必要的。一个替代和等效的命令是

/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h; done;'
Run Code Online (Sandbox Code Playgroud)

这与原始命令具有相同的效果,因为除了在该命令中运行wait后台作业 ( sleep)之外,没有真正发生任何事情。