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

一些名字

我写了以下脚本:

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中做到这一点?

x

Bash在subshel​​l中运行$(),因此结束时将丢弃VARIABLEinside的分配这就是为什么不保留变量的原因。$(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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自另一个页面的会话变量在子域上不可见

变量在另一个块中也可见

如何使一个javascript函数在另一个内部和外部可见

为什么扩展功能在另一个模块中不可见?

我的协议定义在另一个Swift文件中不可见

ProtoBuffer通过gradle生成的类在IntelliJ的另一个模块中不可见

ThreeJS:在另一个网格中时,网格变得不可见

从另一个应用程序启动外部“不可见”应用程序

在另一个不可见的textview上的textview,请不要点击

如何解决“隐式超级构造函数classA()不可见。必须显式调用另一个构造函数吗?

子类成员变量对另一个子类的可见性

如何使Bootstrap sass变量对另一个导入的sass文件可见?

命名空间范围的模板函数在另一个命名空间中可见

具有不可见构造函数的公共类可以由另一个包中的类扩展吗?

允许在一个打开的工作簿中使用UDF,但在另一个工作簿中使其不可见/不可用/不可访问

如何在另一个函数中使用来自另一个函数的变量?

SharedPreferences 保存单击后不可见的按钮更改并让出现另一个按钮

Android如果一个视图位于FrameLayout中另一个视图的顶部,并且是不可见的,它会拦截单击/触摸事件吗?

如何设置一个班级从另一个可见?

根据另一个视图的可见性隐藏一个视图

如何与来自另一个函数/方法的对象/变量交互?

从另一个类中的另一个线程更改视图可见性

UITableView,不可见区域中的另一个单元格带有选中标记,而触摸了可见区域中的一个单元格

处理来自另一个模块的模块变量

来自另一个主机的变量

来自另一个 applicationId 风格的 Gradle 变量

如何将变量设置为一个处理程序可见于另一个处理程序?

Reactjs:来自另一个类或函数的 setState

如果元素可见,则对另一个元素进行一些处理