【发布时间】:2019-12-17 09:58:21
【问题描述】:
set -u
cat <<EOF
$FOO
bar
EOF
打印:-bash: FOO: unbound variable 并返回 1。这就是我想要的。
但是这个:
set -u
foo() { echo $FOO; }
cat <<EOF
$(foo)
bar
EOF
打印:
-bash: FOO: unbound variable
bar
并返回 0。
我正在寻找一种使后者的 sn-p 行为与前者相同的好方法。 有什么想法吗?
更新 从我目前得到的答案来看,我认为我需要稍微澄清一下用例,因为上面的例子有点简化。
我所追求的是一种原始的“模板处理”。 有一个通用模板,带有一些“可配置部分”,例如:
cat user.json
{
"id": "$USER_ID",
"name": "$USER_NAME",
"roles": "$(ROLES director)",
}
然后有一些输入:
cat peter.sh
USER_ID=foo
USER_NAME=peter
ROLES() { cat ${1}_roles.text | grep $USER_ID }
然后“模板处理器”会做这样的事情:
. peter.sh
set -u
contents="$(<user.json)"
eval "cat <<EOF
$contents
EOF
"
变量和函数都是处理器外部的,它不知道它们是什么,所以
(1) 我无法在 heredoc 实际执行之前评估所有函数,因为我不知道它们是什么(以及如何处理它们),并且
(2) 我不能像@suspectus 建议的那样做$(foo) && bar || $FOO_UNKNOWN 之类的事情,因为bar 这里必须是模板的其余部分。
还有其他想法吗?
【问题讨论】:
-
请注意:您的第二个示例的
echo $FOO不应该是$FOO吗? -
打电话
eval的原因是什么? -
@anubhava 扩展变量/函数