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

Пахнет ошибкой, но, вероятно, кто-нибудь сможет это объяснить:

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

#!/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
17
задан David Parks 11 July 2011 в 23:41
поделиться