Используйте & (амперсанд) в однострочном цикле 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: синтаксическая ошибка рядом с неожиданным токеном `; '

ljs.dev
источник

Ответы:

85

Оставь ;после &. Это синтаксическое требование

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
Iruvar
источник
1
Черт возьми, 43 секунды слишком медленные :)
Мартин фон Виттих,
2
@MartinvonWittich, +1 к вашему ответу в порядке сочувствия ;-)
iruvar
4
Хотя это отвечает на вопрос, вероятно, это не то, чего хочет OP, поскольку к тому времени, когда все экземпляры python будут запущены и инициализируются, они все увидят numbers.txtсодержимое 255.
Стефан Шазелас
1
Согласился с @StephaneChazelas, но не уверен, что мы действительно можем с этим поделать с информацией, приведенной в вопросе. Надлежащее решение этого, вероятно, нуждается в большем количестве контекста.
CVn
3
Вот справочник руководства по bash: gnu.org/software/bash/manual/bashref.html#Lists
Гленн Джекман
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
* Конечно, у меня был <=первоначальный вопрос, поэтому диапазон, который вы предоставили, был полностью подходящим, исходя из информации, которую я предоставил.
Еще
10

Потерять ;:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done
Мартин фон Виттих
источник