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

* Конечно, у меня был <=первоначальный вопрос, поэтому диапазон, который вы предоставили, был полностью подходящим, исходя из информации, которую я предоставил.
Еще

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.