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

时间:2018-05-19 16:35:04

标签: linux bash environment-variables io-redirection scoping

我写了以下脚本:

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,但我需要调用VARIABLE时设置的foo值。如何在bash中执行此操作?

1 个答案:

答案 0 :(得分:3)

Bash runs $() in a subshell,因此当VARIABLE结束时,$(foo)$()的作业将被丢弃。这就是为什么不保留变量的原因。

标准输入/输出/错误始终可用,除非您更改它们。因此,您应该能够:

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

<强>解释

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

  • foo生成输出到stdout
  • $()从stdout复制到命令行
  • echo从命令行复制到stdout(!!)
  • >&2从stdout重定向到stderr

echo $()序列具有从stdout复制到stdout :)的净效果,所以你可以消除它。 *

*但在其他情况下,您可能需要echo $(),例如,如果您使用$()作为副作用,或者您故意调用子壳以保护自己免受变量被你正在执行的东西改变了。但是,我认为这些案例可能不常见。