LINUX.ORG.RU

Как работает read -a и readarray?

 , ,


1

2

Нужно прочитать выхлоп и занести его в массив. Разделитель - новая строка. Пример

dig +noall +short yandex.ru
77.88.55.55
77.88.55.50
5.255.255.80
5.255.255.88

dig +noall +short yandex.ru | readarray arr1
echo ${arr1[@]}
пустота

Тоже самое с read -a, тоже самое с readarray -d '\n', тоже самое с

dig +noall +short yandex.ru | while read -r i; do arr1+=( $i ); done

Судя по всему, дело не в сепараторе элементов (IFS=$‘\n’ не помогает). Как занести все в массив?

Это один из подводных камней шелла: при использовании идиомы | while создаётся дочерний процесс, внутри которого переменные изменяются, а после завершения которого благополучно теряются. (Точнее, при использовании | всегда создаётся дочерний процесс, но когда с правой стороны находится тоже bash, родительский процесс не может обратно получить его переменные.) Раз уж используете башизмы, может, поможет readarray ... <(команда)?

AITap ★★★★★
()