首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux 工具命令(04): envsubst2 一个比使用 envsubst 更省心的环境变量渲染工具

Linux 工具命令(04): envsubst2 一个比使用 envsubst 更省心的环境变量渲染工具

作者头像
老麦
发布2023-02-25 20:18:43
发布2023-02-25 20:18:43
8370
举报
文章被收录于专栏:Go与云原生Go与云原生

Linux 工具命令(04): envsubst2 一个比使用 envsubst 更省心的环境变量渲染工具

状态: 未更新

原文链接: https://typonotes.com/posts/2023/02/22/envsubst2-usage/

对于配置文件的渲染, 通常我们会使用 envsubst。这个工具基本上在 Linux 各个发行版上都可以通过官方源进行安装。

  1. 安装
代码语言:javascript
复制
# alpine
$ apk add --no-cache gettext

# ubuntu
$ apt instsall gettext
  1. 渲染
  • 默认模式, 这种模式会替换所有 变量站位符, 包括 abc 或者 {abc}, 如果变量不存在, 则使用 空字符串 进行替换。
  • 白名单模式, 这种模式可以指定 需要替换白名单变量。这种模式就是的麻烦点在于 当白名单变量 太多的时候, 命令看起来就乱糟糟的。
代码语言:javascript
复制
$ 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 的配置, 应该就能理解我说的是什么情况。

代码语言:javascript
复制
server {
    listen  443;

    resolver  ${DNS_RESOLVER};  # 这里 ${DNS_RESOLVER} 需要替换
    # resolver  $DNS_RESOLVER;  # 另一个没有花括号的写法。

    location / {
        proxy_pass http://$host;  # 这里 $host 不需要替换
        proxy_set_header Host $host;
    }
}

如果是用 envsubst 替换,

  1. 白名单模式, 指定 ${DNS_RESOLVER} 替换。
  • 1. 需要替换的变量多2. 需要替换的变量随时可能变 的时候, 维护起来就会很麻烦。
  1. 或者 转义 不需要被替换的的 符号。例如 \host.
  • 这样维护模版就会非常的麻烦。

我们的工作, 需要 更简单更通用更无脑。不应该在这些琐碎的事情上浪费时间。

于是便又了 envsubst2

envsubst2 的使用方式

envsubst2 使用了 {[a-zA-Z0-9_]+} 作为正则匹配的 模版。意味着, 只有类似 {key1} 这种带有花括号的变量才会被渲染

这样做,

  1. 兼容 envsubst 的使用使用, 迁移过来更方便。
  2. 减少认知压力, 不用在担心 key1 和 {key1} 这样 有没有花括号 的问题了。

默认情况下, envsubst2 只会读取 存在环境变量 进行替换。如果 变量存在, 且值为空 也会替换。

注意:变量 不存在值为空 是两种不同的状态。

代码语言:javascript
复制
$ 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 个参数

  1. --input: 输入文件(模版文件)。
  2. --outpu: 输出文件, 内容保存的地方。如果没有指定, 则为 屏幕标准输出
  3. --force-replace: 强制替换所有变量, 即使变量值为空 或者 没有被设置
  4. 默认 替换所有 ${key1} , 不论其值是否为空。
  • 但是可以通过开关 --force-update=false 关闭。当关闭状态时, ${key1} 值为空时 不替换 , 即在文件中保留字面值。

Demo 案例

模版

代码语言:javascript
复制
My home path is ${HOME}.
My user is ${USER}.

This variables doesn't exist: ${DONT_EXIST}
This variables is empty: ${EMPTY}

渲染

代码语言:javascript
复制
$ EMPTY="" ./envsubst2 --input template.txt --force-replace=false

结果

代码语言:javascript
复制
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。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 熊猫云原生Go 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Linux 工具命令(04): envsubst2 一个比使用 envsubst 更省心的环境变量渲染工具
    • 为什么使用 envsubst2
    • envsubst2 的使用方式
    • Demo 案例
    • 源码和下载地址
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档