qui*_*inn 35 bash shell envsubst
有没有办法防止envsubst
替代$VARIABLE
?例如,我希望有类似的东西:
export THIS=THAT
echo "dont substitute \\\$THIS" | envsubst
Run Code Online (Sandbox Code Playgroud)
并让它回来
dont substitute $THIS
Run Code Online (Sandbox Code Playgroud)
但我得到了
dont substitute \THAT
Run Code Online (Sandbox Code Playgroud)
这样做有什么逃避特征吗?
che*_*ner 52
如果给出envsubst
变量列表,它只会替换这些变量,而忽略其他替换.我不确定它是如何工作的,但是类似下面的东西似乎可以做你想要的:
$ export THIS=THAT FOO=BAR
$ echo 'dont substitute $THIS but do substitute $FOO' | envsubst '$FOO'
dont substitute $THIS but do substitute BAR
Run Code Online (Sandbox Code Playgroud)
请注意,它$THIS
是单独的,但$FOO
被替换为BAR
.
iok*_*uon 31
export DOLLAR='$'
export THIS=THAT
echo '${DOLLAR}THIS' | envsubst
Run Code Online (Sandbox Code Playgroud)
或者更清楚:
export THIS=THAT
echo '${DOLLAR}THIS' | DOLLAR='$' envsubst
Run Code Online (Sandbox Code Playgroud)
dan*_*ast 13
我的解决方法如下:
原始模板:
$change_this
$dont_change_this
Run Code Online (Sandbox Code Playgroud)
编辑模板:
$change_this
§dont_change_this
Run Code Online (Sandbox Code Playgroud)
现在您可以处理:
envsubst < $template | sed -e 's/§/$/g'
Run Code Online (Sandbox Code Playgroud)
这依赖于§
没有出现在模板上其他任何地方的字符。您可以使用任何其他字符。
小智 11
$ echo $SHELL
/bin/bash
$ echo \$SHELL
$SHELL
$ echo \$SHELL | envsubst
/bin/bash
$ echo \$\${q}SHELL | envsubst
$SHELL
Run Code Online (Sandbox Code Playgroud)
这样做$$
可以让您添加一个$
字符。然后只是“替换”不存在的变量(在这里我使用了${q}
但可以更有意义的东西${my_empty_variable}
,你最终会得到你需要的。
就像段落解决方案一样 - 你需要一些特别的东西 - 这里......一个不存在的变量,我更喜欢它而不是在模板上执行额外的 sed 。
如果只有一两个变量您不想扩展,您可以通过将它们临时设置为自己的名称来将它们列入白名单,如下所示:
$ echo 'one $two three $four' | four='$four' envsubst
one three $four
Run Code Online (Sandbox Code Playgroud)
在这里,$four
变量被替换为$four
,有效地保持不变。
就我而言,我只想转义尚未定义的变量。为此,请运行:
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')"