我写了以下脚本:
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中做到这一点?
Bash在subshell中运行$()
,因此,结束时将丢弃对VARIABLE
inside的分配。这就是为什么不保留变量的原因。$(foo)
$()
除非您进行更改,否则标准输入/输出/错误始终可用。因此,您应该能够:
bar() {
foo >&2 # <-- redirect foo's output
echo "bar" >&2
echo $VARIABLE >&2
}
说明
您通常可以替换echo $(something)
和类似结构的用法,例如something | cat
。在您的情况下:
foo
产生输出到标准输出$()
从stdout复制到命令行echo
从命令行复制到标准输出(!!)>&2
从标准输出重定向到标准错误该echo $()
序列具有从stdout复制到stdout :)的最终效果,因此您可以消除它。*
*但是在其他情况下,echo $()
例如,如果您正在使用$()
它的副作用,或者您故意调用子外壳程序来保护自己免受正在执行的变量更改的影响,则可能需要这样做。但是,我认为这些情况可能并不常见。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句