Bash “如何展开变量”;改为;从终点站

Bash “如何展开变量”;改为;从终点站,bash,Bash,比如说, 使用以下命令创建bashtmp.sh脚本: export tmp=abc read _test echo "$_test" 执行bash tmp.sh 输入“$tmp/def” 预期结果:“abc/def” 实际结果:“$tmp/def”检查此项 eval "echo $_test" 或 Edit后者(bash-c)使用与eval相比安全的子shell。您可以使用envsubst命令替换如下环境变量: echo "$_test" | envsubst 或者,因为这是在bash中

比如说,

使用以下命令创建bash
tmp.sh
脚本:

export tmp=abc
read _test
echo "$_test"
执行
bash tmp.sh

输入“$tmp/def”

预期结果:“abc/def”

实际结果:“$tmp/def”

检查此项

 eval "echo $_test"


Edit后者(
bash-c
)使用与
eval

相比安全的子shell。您可以使用
envsubst
命令替换如下环境变量:

echo "$_test" | envsubst
或者,因为这是在bash中:

envsubst <<<"$_test"

envsubt为什么脚本用户应该知道有一个变量
tmp
要展开?这是一个过于简化的示例。情况是tmp是目录的环境变量,用户知道这一点。他们必须使用$tmp/xxx在变量中输入子目录的路径,在这里说“_test”,然后脚本知道子目录的路径。必须:-也适用于执行输入。谢谢!我还有一个问题。假设tmp是一个目录,_test是该目录中的一个子目录,然后echo$(bash-c“$_test”),然后它给出一个“bash:xxx:is a directory”再次感谢!因此,我可以使用诸如<代码>测试= $$(BASH-C)ECHOR$YASTER <代码>将其更新回<代码>测试> <代码>变量。我不认为<代码> BASH-C/<代码>比 EVA更安全——它们都具有处理您认为是惰性的数据作为可执行代码的相同的基本风险。在子shell中执行您认为不是命令的东西并不比在主shell中执行它们安全。
envsubst <<<"$_test"