Необычное поведение переменной в циклах while while

Может кто-нибудь объяснить мне, что здесь происходит?

Автор сценария:

#!/bin/sh SKIP="unity-launcher|unity-panel|unity-dash|Hud|XdndCollectionWindowImp|Desktop" WINS=() wmctrl -l | grep -Ev " (${SKIP})" | cut -d \ -f 1 | while read window; do WINS=( ${WINS[@]} $window ) echo "Found window: $window; New size: ${#WINS[@]}" done echo "Total window count: ${#WINS[@]}" echo "Window IDs:" for i in "${WINS[@]}"; do echo " $i" done 

Вывод:

 Found window: 0x0380000a; New size: 1 Found window: 0x038002ae; New size: 2 Found window: 0x03800a33; New size: 3 Found window: 0x03000001; New size: 4 Found window: 0x04c00004; New size: 5 Total window count: 0 Window IDs: 

Ожидаемое:

 Found window: 0x0380000a; New size: 1 Found window: 0x038002ae; New size: 2 Found window: 0x03800a33; New size: 3 Found window: 0x03000001; New size: 4 Found window: 0x04c00004; New size: 5 Total window count: 5 Window IDs: 0x0380000a 0x038002ae 0x03800a33 0x03000001 0x04c00004 

По сути, в конце цикла while массив WINS как-то сбрасывается, и я понятия не имею, почему. Есть ли какая-то странная фигура в bash, о которой я не знаю?

  • Как перейти на обычного пользователя в командной строке при входе в систему как пользователь root?
  • bash: если / elif / fi получает оценку неправильно
  • Почему $ SHELL не изменяется при запуске новой оболочки?
  • Сравнение строк со специальными символами с использованием if-loop не работает
  • Могу ли я добавить свои группы в текущий (shell) процесс?
  • Использование столбца nos в качестве значения переменной
  • Что позволяет вводить команду, пока предыдущая команда все еще работает на переднем плане?
  • Предотвращение бинарных атак в Linux
  • One Solution collect form web for “Необычное поведение переменной в циклах while while”

    Трубы создают подоболочки, и эти подоболочки не могут изменять значения в вышеперечисленных процессах. Пытаться:

     while read window; do WINS=( ${WINS[@]} $window ) echo "Found window: $window; New size: ${#WINS[@]}" done < <(wmctrl -l | grep -Ev " (${SKIP})" | cut -d \ -f 1) 
    Linux и Unix - лучшая ОС в мире.