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

17

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

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

#!/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
    
задан David Parks 12.07.2011 в 12:41
источник

1 ответ

24

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

Ссылка

Ссылка

    
ответ дан Rajish 12.07.2011 в 13:28