BASH:仅当函数通过管道传输时,全局变量在函数中不可更新(简单示例)

Posted

技术标签:

【中文标题】BASH:仅当函数通过管道传输时,全局变量在函数中不可更新(简单示例)【英文标题】:BASH: Global variables aren't updateable in a function only when that function is piped (simple example) 【发布时间】:2011-10-03 12:34:34 【问题描述】:

这闻起来很臭,但可能有人可以解释一下:

以下脚本不起作用,输出如下:

#!/bin/bash
GLOBAL_VAR="OLD"
myfunc() 
        echo "func before set> $GLOBAL_VAR"
        GLOBAL_VAR="NEW"
        echo "func after set> $GLOBAL_VAR"

myfunc | cat
echo "final value> $GLOBAL_VAR"

输出:

func before set> OLD
func after set> NEW
final value> OLD

现在,只需取下 | cat 即可!

#!/bin/bash
GLOBAL_VAR="OLD"
myfunc() 
        echo "func before set> $GLOBAL_VAR"
        GLOBAL_VAR="NEW"
        echo "func after set> $GLOBAL_VAR"

myfunc
echo "final value> $GLOBAL_VAR"

输出:

func before set> OLD
func after set> NEW
final value> NEW

【问题讨论】:

【参考方案1】:

管道创建子外壳。在bash manual 中说子shell 不能修改其父母的环境。请参阅以下链接:

http://www.gnu.org/software/bash/manual/bashref.html#Pipelines

http://wiki.bash-hackers.org/scripting/processtree#actions_that_create_a_subshell

【讨论】:

以上是关于BASH:仅当函数通过管道传输时,全局变量在函数中不可更新(简单示例)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用定时全局变量影响 bash while 循环?

仅当烧瓶中的变量发生变化时才更新网站

Node-sass 不在 npm 脚本中使用管道

通过回声管道将python变量(字符串)传递给bash命令[重复]

自动化测试时需要使用python,请问如何理解python中的全局变量和局部变量?

使用另一个命令通过管道传输时如何读取命令的返回码[重复]