у меня есть код

# Inside Child.sh
ChildVariable=BigChild

# Inside Parent.sh
source ./Child.sh 
echo "ChildVariable=${ChildVariable}"

Выход:

ChildVariable=BigChild

Но,

# Inside Parent.sh
source ./Child.sh  | sed 's/\(.*\)/\t\1/'
echo "ChildVariable=${ChildVariable}"

Выход:

ChildVariable=

Мне нужно сделать отступ для вывода (если есть) Child.sh поэтому мне нужно передать вывод в sed. Но я не понимаю, почему ChildVariable не установлен?

1 ответ1

2

От man 1 bash:

Каждая команда в конвейере выполняется как отдельный процесс (т. Е. В подоболочке).

Ты получаешь из подоболочки; переменная задается в подоболочке, а не в оболочке, в которой работает Parent.sh .

Это будет источник Child.sh в правой оболочке:

# Inside Parent.sh
source ./Child.sh > >(sed 's/\(.*\)/\t\1/')
echo "ChildVariable=${ChildVariable}"

хотя теперь вывод sed может появиться после вывода echo (условие гонки). На данный момент я думаю, что лучший способ справиться с этой проблемой - это перепроектировать всю программу, чтобы вам не нужно было фильтровать вывод из какого-либо сценария.

Вы пометили поэтому замена source и процесса (> >(…)) в порядке. Сделать этот портативный (-ниш?) нужно использовать . вместо source и введем некоторые хитрости с fifos.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .