bash HERE 文档评估

问题描述 投票:0回答:1

我在 bash 中发现了一个奇怪的问题 我使用 HERE-doc 如下

source <(cat << EOL | tee /tmp/buildvar_eval.sh
TODAY=$(date +%y%m%d)
PATH_JOB=$HOME
PATH_SRC=${PATH_JOB}/aaaa
PATH_OUT=${PATH_SRC}/bbbb
echo [$PATH_SRC][$PATH_OUT]
EOL
)

What I expected is [/home/myaccount/aaaa][/home/myaccount/bbbb]

but it outpus below.
I executed it same terminal 4 times.

1st try: it print out [][]
2nd try: it print out [aaaa][bbbb]
3rd try: it print out [/home/myaccount/aaaa][/home/myaccount/bbbb]
4th try: it print out [/home/myaccount/aaaa][/home/myaccount/bbbb]

看起来它并没有反复评估 HERE-doc 中的价值

Q1。造成这种情况的根本原因是什么? Q2。还有其他方法可以克服吗?

bash shell environment-variables heredoc
1个回答
0
投票

第一次执行代码时,将会构建 HERE 字符串。此时,所有变量最初都是空的。你的字符串本质上变成了

PATH_JOB=/home/myaccount
PATH_SRC=/aaaa
PATH_OUT=/bbbb
echo [][]

然后你获取这个字符串。这会导致定义

PATH_SRC
PATH_OUT
。如果重复该过程,现在构造 HERE 字符串会替换新定义的值,并且它会变成

PATH_JOB=/home/myaccount
PATH_SRC=/home/myaccount/aaaa
PATH_OUT=/aaaa/bbbb
echo [/aaaa][/bbbb]

如果将构建字符串与获取字符串分开,您可以更轻松地了解发生了什么:

string=$(cat << EOL | tee /tmp/buildvar_eval.sh
TODAY=$(date +%y%m%d)
PATH_JOB=$HOME
PATH_SRC=${PATH_JOB}/aaaa
PATH_OUT=${PATH_SRC}/bbbb
echo [$PATH_SRC][$PATH_OUT]
EOL
)
echo Temorary script:
cat /tmp/buildvar_eval.sh
source  /tmp/buildvar_eval.sh

现在重复该过程并观察字符串如何以不同的方式构建,因为

source
命令导致了变量的定义。

© www.soinside.com 2019 - 2024. All rights reserved.