Linux envsubst命令示例
1. 概述
在许多情况下,模板、配置或初始化文件将 bash 变量的名称保留为占位符。
因此,我们需要在实际使用之前填写变量的值。
我们将学习如何使用envsubst 命令来做到这一点。
2. envsubst的基本特点
envsubst命令在输入中搜索模式*$VARIABLE或${VARIABLE}*。然后,它将模式替换为相应 bash 变量的值。
相反,不引用任何变量的模式被空字符串替换。
此外,envsubst只识别导出的变量 。
该命令是 GNU ‘gettext’ 包的一部分。它的基本语法是:
envsubst [OPTION] [SHELL-FORMAT]
3. 使用示例
让我们在文件welcome.txt中准备一个简单的问候模板。我们将使用名称来称呼用户,添加桌面会话的名称,并以特定的问候语结束:
Hello user $USER in $DESKTOP_SESSION. It's time to say $HELLO!
让我们导出HELLO变量:
$ export HELLO="good morning"
$ envsubst < welcome.txt
Hello user joe in Lubuntu. It's time to say good morning!
现在,让我们unset 这个变量:
$ unset HELLO
$ envsubst < welcome.txt
Hello user joe in Lubuntu. It's time to say !
4. 使用SHELL-FORMAT指定变量
** SHELL-FORMAT参数选择要替换的变量。**
也就是说,只会替换此参数中提到的变量。所有其他变量和包含美元符号的所有其他单词保持不变。
变量模式与命令输入相同 - $VARIABLE或*${VARIABLE}*。
让我们检查一下shell_format_test.txt输入文件:
This is $FOO and this $BAR
另外,让我们设置和导出两个变量FOO和BAR:
$ export FOO=foo export BAR=bar
现在,我们将只替换FOO:
$ envsubst '$FOO' < shell_format_test.txt
This is foo and this $BAR
我们应该在SHELL-FORMAT 的内容周围使用撇号,以防止在调用envsubst之前进行变量替换。
5. SHELL-FORMAT的格式
请注意,SHELL-FORMAT的结构非常灵活。例如,变量可以形成一个分隔列表:
$ envsubst '$FOO,$BAR' < shell_format_test.txt
This is foo and this bar
或者,它们可以是任何文本的一部分:
$ envsubst 'Please deal with $FOO and $BAR'< shell_format_test.txt
This is foo and this bar
变量模式必须只包含字母数字 ASCII 字符和下划线,并且不能以数字开头。
6. 替换所有环境变量
例如,让我们替换welcome.txt模板文件中的所有环境变量:
$ envsubst "$(printf '${%s} ' $(env | cut -d'=' -f1))" < welcome.txt
Hello user joe in Lubuntu. It's time to say $HELLO!
现在,让我们分析一下SHELL-FORMAT参数。 首先,env 命令提供变量列表及其成对的值。然后,我们cut 每一对并提取变量的名称。
最后,printf 将此名称放入花括号中并添加前导美元符号。
7. 列出SHELL-FORMAT的内容
让我们使用*-v或–variables开关来打印SHELL-FORMAT*参数中存在的所有变量。使用此选项,不会发生实际替换。
因此,让我们以一种非常奇特的方式打印所有环境变量的名称(借助*xargs *和column ):
$ envsubst "$(printf '${%s} ' $(env | cut -d'=' -f1))" --variables | xargs -L4 | column -t
XDG_VTNR LC_PAPER LC_ADDRESS XDG_SESSION_ID
XDG_GREETER_DATA_DIR SELINUX_INIT LC_MONETARY SAL_USE_VCLPLUGIN
CLUTTER_IM_MODULE SESSION GPG_AGENT_INFO TERM
...