BASH: глобальные переменные не обновляются в функции только тогда, когда эта функция передается по конвейеру (простой пример)

это пахнет багги, но, наверное, кто-то может это объяснить:

следующий скрипт не работает, вывод ниже:

#!/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 что подсхемы не могут изменять среду своих родителей. См. следующие ссылки:

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

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