envsubst命令

envsubst 是 Linux 中用于替换文本中环境变量的工具,通常用于自动化脚本和模板文件。它会扫描输入中的环境变量,并将其替换为当前的环境变量值。

1. envsubst 的基本语法

envsubst [OPTION] [SHELL-FORMAT]
  • OPTION:可选参数,用于控制 envsubst 的行为。
  • SHELL-FORMAT:要替换的环境变量(通常以 $VARIABLE_NAME 的形式表示)。

envsubst 默认会替换标准输入(stdin)中的环境变量,但你也可以通过重定向来指定输入和输出。

2. envsubst 的常见用法

2.1. 替换文本中的所有环境变量

envsubst 将文本中符合 $VARIABLE 格式的环境变量替换为当前环境变量的值。

示例: 假设有以下环境变量:

export NAME="John"
export AGE="30"

创建一个模板文件 template.txt

Hello, my name is $NAME. I am $AGE years old.

使用 envsubst 来替换文本中的环境变量:

envsubst < template.txt

输出:

Hello, my name is John. I am 30 years old.

2.2. 仅替换特定的环境变量

你可以指定要替换的环境变量,而不是全部替换。通过在命令行中显式指定要替换的变量。

示例:

export NAME="John"
export AGE="30"

假设 template.txt 内容为:

Hello, my name is $NAME. I am $AGE years old. I live in $CITY.

你可以只替换 $NAME,而保留其他变量不变:

envsubst '$NAME' < template.txt

输出:

Hello, my name is John. I am $AGE years old. I live in $CITY.

2.3. 将替换结果保存到文件

可以将 envsubst 的输出重定向到一个新的文件中。

示例:

envsubst < template.txt > result.txt

此操作会将替换后的内容保存到 result.txt 文件中。

3. envsubst 的选项

  • SHELL-FORMAT:指定要替换的环境变量列表,使用 $VAR${VAR} 格式。如果未指定,envsubst 会替换所有环境变量。
  • -v:显示版本信息。
  • -h:显示帮助信息。

4. 使用示例

4.1. 结合 Bash 脚本使用

envsubst 常用于自动化脚本和配置文件生成中。假设你有一个 Bash 脚本,需要动态生成配置文件。

创建 config.template 文件:

DB_HOST=$DB_HOST
DB_USER=$DB_USER
DB_PASSWORD=$DB_PASSWORD

编写 Bash 脚本:

#!/bin/bash

export DB_HOST="localhost"
export DB_USER="admin"
export DB_PASSWORD="secret"

envsubst < config.template > config.conf

执行后,将生成 config.conf 文件:

DB_HOST=localhost
DB_USER=admin
DB_PASSWORD=secret

4.2. 结合 Docker 使用

envsubst 也常用于容器环境中生成配置文件。假设有一个 Nginx 配置文件模板,需要动态配置服务器的主机名。

创建 nginx.template.conf

server {
    listen 80;
    server_name $HOST_NAME;
}

在 Docker 环境中,可以用以下命令生成实际的 Nginx 配置:

export HOST_NAME="example.com"
envsubst < nginx.template.conf > /etc/nginx/nginx.conf

生成的 /etc/nginx/nginx.conf 文件内容为:

server {
    listen 80;
    server_name example.com;
}

也常用于编写k8s的yaml文件,例如clusterconfig.yaml内容:

---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: eksworkshop-eksctl
  region: ${AWS_REGION}

fargateProfiles:
  - name: fargate-productcatalog
    selectors:
      - namespace: prodcatalog-ns
        labels:
          app: prodcatalog

执行envsubst < deployment/clusterconfig.yaml :

image-20210614111200347

4.3. 结合环境变量文件使用

可以将环境变量保存在一个文件中,并使用 source 来加载它,然后用 envsubst 进行替换。

步骤:

  1. 创建一个环境变量文件 env_vars.sh

    export NAME="Alice"
    export AGE="28"
    
  2. 使用 source 命令加载环境变量:

    source env_vars.sh
    
  3. 使用 envsubst 替换模板中的变量:

    envsubst < template.txt > result.txt
    

5. 总结

  • envsubst 是一个轻量级工具,主要用于将文本中的环境变量替换为其实际值,广泛应用于自动化脚本、配置文件生成等场景。
  • 它支持直接处理标准输入和输出,也能处理文件,并且允许指定需要替换的环境变量。