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

Это пахнет глючно, но, возможно, кто-то может объяснить это:

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

#!/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 Ответ

24 голосов
/ 12 июля 2011

Труба создает подоболочку. В руководстве bash сказано, что подоболочки не могут изменять среду своих родителей. Смотрите эти ссылки:

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

http://wiki.bash -hackers.org / скриптовый / processtree # actions_that_create_a_subshell

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...