Баш трубопроводов препятствует глобальной переменной



unset v
function f {
v=1
}
f | cat
echo v=$v
f
echo v=$v


Почему конвейерная передача (в любую команду) не позволяет первой команде echo напечатать 1? Второе эхо печатает 1. Я использую оболочку от удара. Я могу увидеть это, скопировав / вставив или запустив это как скрипт.

598   1  

1 ответ:

Все компоненты конвейера (если их несколько) выполняются в подрешетке, и их переменные назначения не сохраняются в основной оболочке.

Причина этого в том, что bash не поддерживает реальную многопоточность (с параллельным доступом к переменным), только подпроцессы, которые выполняются параллельно.


Как этого избежать :

Вы должны выполнить любые назначения переменных, которые хотите сохранить восновном процессе bash (или найти способ их передачи там). Bash-способ сделать это - не использовать трубу, а вместо этого использовать замену процесса:

f > >( cat )

Конечно, это не поможет, если вам нужно выполнить назначение переменных в обоих процессах канала. Тогда вы должны придумать лучший механизм вместо этого (может быть, сопроцессы, и вывести переменные где-то?)

Comments

    Ничего не найдено.