bashЕсть такая конструкция (глупая, просто для примера)
A="0"
echo "Cool" | while read B ; do
A="1"
done
echo $AВ итоге получаем на выход 0, а хотелось бы получить 1. Как это сделать? Иными словами как сделать, чтобы значение присваивалось не локальной A а глобальной A?
>bash
>
>Есть такая конструкция (глупая, просто для примера)
>
>A="0"
>echo "Cool" | while read B ; do
> A="1"
>done
>echo $A
>
>В итоге получаем на выход 0, а хотелось бы получить 1. Как
>это сделать? Иными словами как сделать, чтобы значение присваивалось не локальной
>A а глобальной A?В таком виде никак. Проблема не в цикле а в конвейере из-за которого порождается сабшелл. В таком виде работает:
A="0"
echo "Cool" > temp_file
while read B ; do
A="1"
done < temp_file
echo $A
>В таком виде никак. Проблема не в цикле а в конвейере из-за
>которого порождается сабшелл. В таком виде работает:
>
>A="0"
>echo "Cool" > temp_file
>while read B ; do
> A="1"
>done < temp_file
>echo $AИнтересно. Спасибо.
A="0"
while read B
do
A="1"
done < <(echo "Cool")
echo $AОбрати внимание, что между < < есть пробел, а между <( пробела нет. Шаг влево или вправо - попытка побега. Прыжок на месте - провокация.
Ключевые слова "subshell avoidance".
>A="0"
>while read B
>do
> A="1"
>done < <(echo "Cool")
>echo $A
>
>Обрати внимание, что между < < есть пробел, а между <( пробела
>нет. Шаг влево или вправо - попытка побега. Прыжок на месте
>- провокация.
>
>Ключевые слова "subshell avoidance".М-да. Такой конструкции я не знал.
Thanks!