История изменений
Исправление
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