LINUX.ORG.RU

[bash][openvz] Проблема с выполнением цикла while

 ,


0

2

Вариант 1: не передаем команду:

root@goro:~# seq 101 111 | while read i ; do vzctl exec $i ; done
No command line given for exec
No command line given for exec
*** etc ***

цикл выполняется.

Вариант 2: пробуем что-то, кроме exec:

root@goro:~# seq 101 111 | while read i ; do vzctl status $i ; done
CTID 101 exist mounted running
CTID 102 exist mounted running
CTID 103 exist mounted running
*** etc ***

цикл выполняется.

Вариант 3: пробуем for:

root@goro:~# for i in `seq 101 111` ; do vzctl exec $i id ; done
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
*** etc ***

Цикл выполняется.

А теперь, собственно, вопрос:

root@goro:~# seq 101 111 | while read i ; do vzctl exec $i id ; done
uid=0(root) gid=0(root) groups=0(root)
root@goro:~#
цикл выполняется один раз и все. Почему? Причем,

root@goro:~# seq 101 111 | while read i ; do vzctl exec $i id && echo blah $HOSTNAME ; done
uid=0(root) gid=0(root) groups=0(root)
blah goro
root@goro:~#

команды после vzctl выполняются, т.е., он завершается успешно и не break'ает цикл.

А, да, Debian Squeeze

★★★★★

Последнее исправление: YAR (всего исправлений: 2)

один раз и все. Почему?

Вероятно, потому что остальной вывод seq зохавал сотона считал vzctl.

Попробуй так:

seq 101 111 | while read i ; do vzctl exec $i id </dev/null; done

gorilych ★★
()
Ответ на: комментарий от YAR

входной поток для условия while (read) и тела while (vzctl) - общий.

read считывает 101 vzctl считывает 102 - 111, до тех пор пока не наткнётся на EOF

Добавление </dev/null к команде «прицепляет» к её входу /dev/null, а исходный поток остаётся не тронутым и поэтому read имеет возможность считать оставшиеся числа.

gorilych ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.