来自另一个函数的变量不可见?
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以保护自己免受正在执行的内容更改的变量的影响。但是,我认为这些情况可能并不常见。
我写了以下脚本:
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以保护自己免受正在执行的内容更改的变量的影响。但是,我认为这些情况可能并不常见。