

状态: 未更新
原文链接: https://typonotes.com/posts/2023/02/22/envsubst2-usage/
对于配置文件的渲染, 通常我们会使用 envsubst。这个工具基本上在 Linux 各个发行版上都可以通过官方源进行安装。
# alpine
$ apk add --no-cache gettext
# ubuntu
$ apt instsall gettext
$ envsubst < /path/2/template.txt > /path/2/target.txt
$ envsubst '${key1} ${key2}' < /path/2/template.txt > /path/2/target.txt
更多参考 Linux 工具命令(03): 使用 envsubst 渲染环境变量到文件
envsubst2使用 envsubst 进行模版渲染, 如果要保留某些 变量格式的字符串 , 就有点麻烦了。如果你搞过 Nginx 的配置, 应该就能理解我说的是什么情况。
server {
listen 443;
resolver ${DNS_RESOLVER}; # 这里 ${DNS_RESOLVER} 需要替换
# resolver $DNS_RESOLVER; # 另一个没有花括号的写法。
location / {
proxy_pass http://$host; # 这里 $host 不需要替换
proxy_set_header Host $host;
}
}
如果是用 envsubst 替换,
${DNS_RESOLVER} 替换。我们的工作, 需要 更简单, 更通用, 更无脑。不应该在这些琐碎的事情上浪费时间。
于是便又了 envsubst2。
envsubst2 的使用方式envsubst2 使用了 {[a-zA-Z0-9_]+} 作为正则匹配的 模版。意味着, 只有类似 {key1} 这种带有花括号的变量才会被渲染
这样做,
envsubst 的使用使用, 迁移过来更方便。默认情况下, envsubst2 只会读取 存在 的 环境变量 进行替换。如果 变量存在, 且值为空 也会替换。
注意:变量 不存在 和 值为空 是两种不同的状态。
$ envsubst2 -h
version: v0.1.8+sha.5acb37b-devel
Usage:
envsubst2 [flags]
Flags:
--force-replace replace all the placeholders, even if their value is empty (default true)
-h, --help help for envsubst2
--input string input file
--output string output file, os.Stdout if empty.
当前版本, 支持以上 3 个参数
--input: 输入文件(模版文件)。--outpu: 输出文件, 内容保存的地方。如果没有指定, 则为 屏幕标准输出。--force-replace: 强制替换所有变量, 即使变量值为空 或者 没有被设置。${key1} , 不论其值是否为空。--force-update=false 关闭。当关闭状态时, ${key1} 值为空时 不替换 , 即在文件中保留字面值。模版
My home path is ${HOME}.
My user is ${USER}.
This variables doesn't exist: ${DONT_EXIST}
This variables is empty: ${EMPTY}
渲染
$ EMPTY="" ./envsubst2 --input template.txt --force-replace=false
结果
My home path is /Users/devops.
My user is devops.
This variables doesn't exist: ${DONT_EXIST}
This variables is empty:
代码已经放在了 Github 上:
https://github.com/tangx/envsubst2
如果在使用中有什么问题或优化建议, 请顺手提个 Issue。