来自另一个函数的变量不可见?

Variable from another function is not visible?

我写了以下脚本:

bar() {
        echo $(foo) >&2
        echo "bar" >&2
        echo $VARIABLE >&2
}

foo() {
        echo "foo" >&2
        VARIABLE="test"
        echo $VARIABLE >&2
}
bar

输出为

foo
test

bar

但是如果我这样写:

bar() {
        foo
        echo "bar" >&2
        echo $VARIABLE >&2
}

foo() {
        echo "foo" >&2
        VARIABLE="test"
        echo $VARIABLE >&2
}
bar

它打印出我需要的东西:

foo
test
bar
test

问题是我需要将 foo 的结果发送到 &2,但我需要调用 foo 时设置的 VARIABLE 值。如何在 bash 中执行此操作?

Bashruns $() in a subshell,所以当$()结束时,$(foo)里面对VARIABLE的赋值就被丢弃了。这就是不保留变量的原因。

标准 input/output/error 始终可用,除非您更改它们。因此,您应该能够做到:

bar() {
        foo >&2             # <-- redirect foo's output
        echo "bar" >&2
        echo $VARIABLE >&2
}

说明

您通常可以替换 echo $(something) 和类似结构的用法,例如 something | cat。在你的情况下:

  • foo 将输出输出到标准输出
  • $() 从标准输出复制到命令行
  • echo 从命令行复制到标准输出 (!!)
  • >&2 从标准输出重定向到标准错误

echo $() 序列具有从 stdout 复制到 stdout 的实际效果:),因此您可以删除它。*

* 但在其他情况下,您可能需要 echo $(),例如,如果您使用 $() 来解决它的副作用,或者您故意调用子 shell以保护自己免受正在执行的内容更改的变量的影响。但是,我认为这些情况可能并不常见。