envsubst 中的 SHELL-FORMAT 是什么?

Nob*_* SE 39 bash environment-variables

当我偶然发现envsubst我只想用它来替换特定变量并怀疑 SHELL-FORMAT 参数可能是我想要的但我无法让它工作时。

不幸的是,maninfo页面没有给出任何使用示例,只说

如果给出了 SHELL-FORMAT,则仅替换 SHELL-FORMAT 中引用的那些环境变量

这并没有告诉我如何引用它们。

Nob*_* SE 37

如文本所示,您只需像在通常的 shell 命令中一样引用(例如,通过$VARNAME${VARNAME})变量。但是,您必须确保外壳不会事先展开它们。

以下是一些示例来说明这一点(假设export FOO=BAR):

$ echo '$FOO$FOO2' | envsubst
BAR
Run Code Online (Sandbox Code Playgroud)

如您所见, $FOO2 已被替换为 "",因为它没有被定义。现在我们可以通过以下方式将该替换限制为仅 $FOO:

$ echo '$FOO$FOO2' | envsubst '$FOO'
BAR$FOO2
Run Code Online (Sandbox Code Playgroud)

""''需要之前使用而不是会导致替换:

echo '$FOO$FOO2' | envsubst "$FOO"
$FOO$FOO2
Run Code Online (Sandbox Code Playgroud)

(这相当于envsubst "BAR"没有检测到变量的有效调用,因此没有被替换。)

正如man-page 所说,所有引用的变量都SHELL-FORMAT被替换,所以我们甚至可以这样做:

echo '$FOO$FOO2$FOO3' | envsubst '$FOO some more text ${FOO3}'
BAR$FOO2
Run Code Online (Sandbox Code Playgroud)

如您所见,SHELL-FORMAT它非常灵活。

最后,该参数--variables允许您评估选择哪些变量进行替换SHELL-FORMAT

envsubst --variables '$FOO some more text ${FOO3}'
FOO
FOO3
Run Code Online (Sandbox Code Playgroud)

在上面的过早替换示例中,这将显示错误:

$ envsubst --variables "$FOO"
(empty string returned)
Run Code Online (Sandbox Code Playgroud)

man-page中所述,envsubst--variables存在时不处理任何 stdinput 。

  • 在这一点上,我仍然不明白何时/为什么有人会想要使用 `envsubst --variables '$FOO blah'` 命令。这说明如果缺乏示例或解释,技术上准确/精确的手册页几乎毫无用处。 (5认同)

ded*_*bel 15

以下是一些帮助我理解如何正确使用它的示例。令我惊讶的是 envsubst 只替换参数中提到的变量。

export FOO_X="value_x"
export FOO_Y="value_y"
export FOO_Z="value_z"


$ echo 'x=$FOO_X y=$FOO_Y z=${FOO_Z}' | envsubst
x=value_x y=value_y z=value_z

$  echo 'x=$FOO_X y=$FOO_Y z=${FOO_Z}' | envsubst '$FOO_X'
x=value_x y=$FOO_Y z=${FOO_Z}

$ echo 'x=$FOO_X y=$FOO_Y z=${FOO_Z}' | envsubst '$FOO_X $FOO_Z'
x=value_x y=$FOO_Y z=value_z

$ echo 'x=${FOO_X} y=${FOO_Y} z=${FOO_Z}' | envsubst '$FOO_Z ${FOO_Y}'
x=${FOO_X} y=value_y z=value_z
Run Code Online (Sandbox Code Playgroud)

$VAR${VAR}顺便说一句,两者似乎都有效。顺序无关紧要。

我也不明白 SHELL-FORMAT 是什么意思,仍然不知道为什么它会这样命名。但是经过上面的实验,我想我知道它做了什么。