Необычное поведение переменной в циклах 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, о которой я не знаю?

  • Как отменить экспорт DISPLAY в Linux?
  • Каков самый простой способ добавить строку в начале каждой строки файла из командной строки?
  • как перечислить события заблокированных подключений через брандмауэр?
  • Терминал против bash?
  • Как я могу сделать скрипт для подсчета по пятам?
  • предотвратить " + сделать $ scriptname" и " 31303", который будет показан
  • Как я могу повернуть поведение gedit something & disown` в поведение по умолчанию при вызове gedit из командной строки?
  • Как я могу получить $ PATH, чтобы всегда включать $ (pwd) /sub_directory/.bin
  • 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) 
    Interesting Posts

    Является ли реализация Linux конфигурации «переменной» ARG_MAX отличной от других системных переменных и совместима ли она с POSIX?

    как отключить $ character escaping в командной строке

    когда использовать «su -l loginname -c somecommand»?

    Требуется минимальный дистрибутив linux, размер установки которого составляет менее 250 – 300 мб

    Могу ли я вводить корейский язык с помощью fcitx под Linux mint 17.2 Cinnamon?

    Хост-процесс для нескольких процессов?

    Alsamixer не работает без звука

    Docker не смог найти доступный, неперекрывающийся пул адресов IPv4

    как написать `fuser -k -n tcp 80` в скрипт bash?

    Linux Mint 13 Xfce – используйте Super_L в нескольких ярлыках

    VirtualBox жалуется, что модуль ядра не загружен

    Лучший способ сделать полное шифрование диска?

    Могу ли я безопасно игнорировать: «предупреждение: подстановка команды: игнорируется нулевой байт на входе»?

    Проблемы с gpg-agent в Manjaro Linux (KDE)

    Запуск приложения с пользовательской средой

    Linux и Unix - лучшая ОС в мире.