我写了以下脚本:
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中执行此操作?
答案 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 $()
,例如,如果您使用$()
作为副作用,或者您故意调用子壳以保护自己免受变量被你正在执行的东西改变了。但是,我认为这些案例可能不常见。