Використовуйте & (ampersand) в однорядковому циклі bash


58

Я успішно використовую цю команду, яка змінює змінну у конфігураційному файлі, а потім виконує скрипт Python в циклі:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py; done

Оскільки для кожного з них DoMyScript.pyпотрібно тривати близько 30 секунд, перш ніж завершити роботу, я хотів би перенести їх на другий план, тоді як наступний може бути породжений.

Я спробував те, що мені знайоме, додавши амперсанд, як показано нижче:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py &; done

Однак це призводить до помилки нижче:

-bash: помилка синтаксису біля несподіваного маркера `; '

Відповіді:


85

Відкиньте ;після &. Це синтаксична вимога

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done

1
Чорт забирай, 43 секунди занадто повільно :)
Мартін фон Віттіч

2
@MartinvonWittich, +1 до вашої відповіді в порядку
доручення

4
Хоча це відповідає на питання, це, мабуть, не те, чого хоче ОП, до моменту запуску всіх екземплярів пітона та ініціалізації, що вони всі побачать, що numbers.txtмістять 255.
Стефан Шазелас

1
Погоджувались з @StephaneChazelas, але я не впевнений, що ми можемо насправді зробити з цим із інформацією, наведеною у питанні. Правильне рішення для цього, ймовірно, потребує більше контексту.
CVn

3
Ось базова посилання на посібник: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman

14

Враховуючи коментар Стефана щодо відповіді 1_CR , ви, мабуть, хочете:

for i in {114..255}; do { echo $i > numbers.txt && python DoMyScript.py; } & done

Дякую, Гленн Я спробував кілька варіантів вашого коду, які мені подобаються через підвищену читабельність, але, можливо, завдяки додатковому сну, який мені потрібен, він не працював для мене. Це також повторило б останнє число в forдіапазоні ... Ось чим я задоволений на даний момент: for((i=1;i<100;i+=1)); do echo $i > numbers.txt;sleep 3; python DoMyScript.py & doneОсновний питання питання отримання процесу для виконання у фоновому режимі вирішений.
ljs.dev

* Звичайно, у мене було питання <=в оригінальному запитанні, тому діапазон, який ви надали, був цілком підходящим на основі інформації, яку я надав. Знову дякую за різний підхід
ljs.dev

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.