linux - BASH:只有当函数被管道传输时,全局变量才在函数中不可更新(简单示例)

标签 linux bash variables cat

这闻起来有问题,但也许有人可以解释一下:

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

#!/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

最佳答案

管道创建子外壳。在bash manual中说子外壳不能修改其 parent 的环境。请参阅这些链接:

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

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

关于linux - BASH:只有当函数被管道传输时,全局变量才在函数中不可更新(简单示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6662915/

相关文章:

linux - Gitlab CI 9.5 服务未运行

c++ - Linux 中的 _wsystem 等价物是什么

javascript - Django 模板变量在脚本标签中无法识别,但在常规 h1 标签中可识别。是什么原因造成的?

php - 如何将选项值传递给按钮

javascript - 在 JS 确认()方法中使用 PHP 变量

C程序中的chdir系统调用

linux - STM32F0-发现: no tty

linux - bash 如何关闭/dev/tty?

循环复杂的 ffmpeg 命令时 Bash 参数 HELL。我该如何逃脱它?

linux - bash 计时器(以毫秒为单位)