LINUX.ORG.RU

История изменений

Исправление Legioner, (текущая версия) :

Напиши в начале shopt -s lastpipe

Длинное объяснение:

Если написать

#!/bin/bash

#shopt -s lastpipe

echo script PID: $BASHPID

i=1
cat array.list | while read str
do
	echo loop PID: $BASHPID
	array["$i"]="$str"
	i=$(($i+1))
done
echo ${array[@]}

то вывод будет примерно такой:

script PID: 26074
loop PID: 26076
loop PID: 26076
loop PID: 26076

т.е. цикл выполняется в другом процессе. Этот другой процесс получает все данные исходного процесса но изменения в другом процессе не отражаются на исходном процессе.

Иными словами когда bash видит command 1 | command 2, даже если command 2 это встроенная команда оболочки, он запускает два отдельных процесса в дополнение к основному.

Опция lastpipe позволяет ему иногда выполнять command 2 в текущей оболочке, таким образом то, что ты там делаешь, отразится в исходной оболочке, включая изменения значений переменных.

Исправление Legioner, :

Напиши в начале shopt -s lastpipe

Длинное объяснение:

Если написать

#!/bin/bash

i=1
cat array.list | while read str
do
   array["$i"]="$str"
   i=$(($i+1))
done
echo ${array[@]}

то вывод будет примерно такой:

script PID: 26074
loop PID: 26076
loop PID: 26076
loop PID: 26076

т.е. цикл выполняется в другом процессе. Этот другой процесс получает все данные исходного процесса но изменения в другом процессе не отражаются на исходном процессе.

Иными словами когда bash видит command 1 | command 2, даже если command 2 это встроенная команда оболочки, он запускает два отдельных процесса в дополнение к основному.

Опция lastpipe позволяет ему иногда выполнять command 2 в текущей оболочке, таким образом то, что ты там делаешь, отразится в исходной оболочке, включая изменения значений переменных.

Исходная версия Legioner, :

Напиши в начале shopt -s lastpipe