Назад | Перейти на главную страницу

запуск нескольких процессов в цикле

В bash пытаюсь запустить сразу несколько xeyes.

Если я сделаю это:

for a in `seq 1 3`; do  "xeyes"; done

Я получаю 1 xeye, а последующие xeyes появляются только тогда, когда я закрываю предыдущий xeye.

Поэтому я попробовал:

for a in `seq 1 3`; do  "xeyes &"; done

Но при запуске этой команды ничего не происходит.

Что я делаю не так?

Bash имеет оператор диапазона и стиль C for петли, так seq обычно не требуется. Он может понадобиться вам в оболочке Bourne или при некоторых особых обстоятельствах. Вот как вы бы сделали свой пример на чистом Bash без вызова каких-либо внешних программ (кроме xeyes):

for a in {1..3}; do xeyes & done    # range of 1 to 3, no vars in this type of {}

или

for ((a = 1; a <= 3; a++)); do xeyes & done    # C-style for loop, can have vars

Обычно запуск приложений с поддержкой X означает, что они не возвращают управление bash до тех пор, пока не закончат работу, как вы видите в первом примере. Во втором примере цитаты (я думаю) запускают подпроцесс, который не знает, под каким дисплеем работать.

Простое разделение его на три строки (чтобы избежать необходимости в кавычках) помогло мне. Другими словами:

for i in `seq 1 3`; do
 xeyes &
done 

Наслаждайтесь! Это не самая полезная демонстрация bash, но я полагаю, что она может быть интересной.

Пытаться

for a in `seq 1 3`; do xeyes & ; done

Ваша ошибка - поставить "xeyes &" в двойных кавычках. Это заставляет bash рассматривать ее буквально как команду из одного слова, содержащую пробел и амперсанд.