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;'"
在 使用的 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)之外,没有真正发生任何事情。