Баш трубопроводов препятствует глобальной переменной
unset v
function f {
v=1
}
f | cat
echo v=$v
f
echo v=$v
Почему конвейерная передача (в любую команду) не позволяет первой команде echo напечатать 1? Второе эхо печатает 1. Я использую оболочку от удара. Я могу увидеть это, скопировав / вставив или запустив это как скрипт.
1 ответ:
Все компоненты конвейера (если их несколько) выполняются в подрешетке, и их переменные назначения не сохраняются в основной оболочке.
Причина этого в том, что bash не поддерживает реальную многопоточность (с параллельным доступом к переменным), только подпроцессы, которые выполняются параллельно.
Как этого избежать :
Вы должны выполнить любые назначения переменных, которые хотите сохранить восновном процессе bash (или найти способ их передачи там). Bash-способ сделать это - не использовать трубу, а вместо этого использовать замену процесса:
f > >( cat )Конечно, это не поможет, если вам нужно выполнить назначение переменных в обоих процессах канала. Тогда вы должны придумать лучший механизм вместо этого (может быть, сопроцессы, и вывести переменные где-то?)
Comments