【问题标题】:Abort heredoc command if a subshell returns an error?如果子shell返回错误,中止heredoc命令?
【发布时间】: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) &amp;&amp; bar || $FOO_UNKNOWN 之类的事情,因为bar 这里必须是模板的其余部分。

还有其他想法吗?

【问题讨论】:

  • 请注意:您的第二个示例的 echo $FOO 不应该是 $FOO 吗?
  • 打电话eval的原因是什么?
  • @anubhava 扩展变量/函数

标签: bash heredoc


【解决方案1】:

它的行为是否必须完全相同?只是一个额外的错误输出-:

set -u
foo() { $FOO; }
cat <<EOF
$(foo) && bar || $FOO_UNKNOWN
EOF

【讨论】:

  • A here-doc 仅受参数扩展、命令替换和算术扩展的约束。这些线条没有被解释为一个整体,所以我认为这行不通。
  • 谢谢。我用对实际用例的更完整描述更新了我的答案,不幸的是,我认为这对我没有帮助。
【解决方案2】:

一个可能的解决方法可以是在here-doc之前调用函数,如果有未绑定的变量则让它退出:

foo() { echo "$FOO"; }

set -u
var="$(foo)" || exit 1
cat <<-EOF
$var
bar
EOF

输出:

FOO: unbound variable

退出状态为1

【讨论】:

  • 谢谢。我用更完整的实际用例描述更新了我的答案,不幸的是,我认为这对我没有帮助。
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
相关资源
最近更新 更多