BASH: глобальные переменные не могут быть обновлены в функции только тогда, когда эта функция передана по каналам (простой пример)
Это пахнет багги, но, вероятно, кто-то может это объяснить:
Следующий script не работает, выход ниже:
#!/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