bash HERE文档评估

bash HERE document evaluation

提问人:OfusJK 提问时间:8/21/2023 最后编辑:OfusJK 更新时间:8/22/2023 访问量:46

问:

我在 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 中的价值

问题1.造成这种情况的根本原因是什么?
问题2.还有其他方法可以克服吗?

bash shell 环境变量 heredoc

评论


答:

2赞 user1934428 8/21/2023 #1

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

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

然后,获取此字符串。这导致了并被定义。如果重复该过程,则构造 HERE 字符串现在将替换新定义的值,它变为PATH_SRCPATH_OUT

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

评论

0赞 OfusJK 8/22/2023
谢谢,我了解问题的原因。有什么方法可以克服这个问题吗?一次源并生成文件?
0赞 user1934428 8/22/2023
关键是,我不知道背景,也不知道你到底想实现什么。例如,您为什么要使用 HERE 文档?您可以简单地将所有这些命令放入一个永久文件(即不在 /tmp 上)并获取它们。或者你可以把命令放到一个函数中。