envsubst有逃脱角色吗?

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.

  • 这有效,但它是全球性的.所以你不能产生''预期'的输出''扩展\ $ FOO是$ FOO'.; 要么两个FOO都被替换,要么两个都没有. (3认同)
  • 不,它没有做提问者想要的.以上接受的答案是正确的. (3认同)
  • @ reza.safiyat参见@ rici的评论; `envsubst`不尊重字符串中的逃逸美元符号. (2认同)

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)

  • @mpyw:该页面为日语。您能总结一下针对“ DOLLAR ='$'`的论点,并指出它的建议吗? (3认同)
  • @TrinitronX 查看 `--variables` 选项行为。所有“SHELL-FORMAT”为您提供的是一种限制被替换的变量集的方法,而不是阻止给定的某些实例被替换。 (3认同)
  • 本文引用声称“DOLLAR='$'”是更糟糕的方式:https://qiita.com/takyam/items/e92e5a6ca1548cbd58db 这个答案不应该被接受。 (2认同)

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 。

  • 这是迄今为止最好的答案。即使您没有能力引入特殊的“DOLLAR=$”环境变量,它也可以工作,并且不需要使用“sed”等单独的程序。如果您只能控制模板,那么其他解决方案就完全行不通。 (2认同)

Mal*_*ous 7

如果只有一两个变量您不想扩展,您可以通过将它们临时设置为自己的名称来将它们列入白名单,如下所示:

$ echo 'one $two three $four' | four='$four' envsubst
one  three $four
Run Code Online (Sandbox Code Playgroud)

在这里,$four变量被替换为$four,有效地保持不变。


use*_*308 5

就我而言,我只想转义尚未定义的变量。为此,请运行:

envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')"

  • 注意:要使用它,例如 `envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" &lt; source.txt.template &gt;目标.txt` (2认同)