Как можно запустить несколько программ в фоновом режиме с помощью одной команды?


36

Как можно запустить несколько программ в фоновом режиме с помощью одной команды?

Я попробовал команды ниже, но они не работают.

nohup ./script1.sh & && nohup ./script2.sh &
-bash: syntax error near unexpected token '&&'

nohup ./script1.sh & ; nohup ./script2.sh &
-bash: syntax error near unexpected token ';'

что такое одиночная «команда»? Линия Баш?
Олуф Лоренцен


Возможно, я упускаю что-то очевидное, но && подразумевает знание кода завершения предыдущей команды. Если вы справитесь с этим, код выхода не будет известен. Какая там была функциональная необходимость?
Richlv

Ответы:


32

С точки зрения синтаксиса оболочки, &отделяет команды вроде ;/ |/ &&... (хотя, конечно, с другой семантикой). Так что это просто:

cmd1 & cmd2 & cmd3 &

1
это не / совсем / правильно, ;запускает следующую команду, как только заканчивается первая. &на самом деле ставит команду на задний план. просто попробуйте это:echo foo & echo bar & echo test &
Олуф Лоренцен

1
@ Финкрег, конечно. Никто не сомневается в этом. Я просто имел в виду, что они обе являются отдельными командами (с точки зрения синтаксиса) без каких-либо последствий для их выполнения.
Стефан Шазелас

Это не совсем то, что было задано, поскольку вопрос указывал выдачу «единой команды». Это не мой ответ, так как он также представляет собой серию команд, но в нем есть хотя бы одна семантика одной команды, в которой выходные данные объединяются, могут перенаправляться и т. Д.
Eli Heady

«Несколько команд с одной командой», кажется, оксюморон - что это значит? Если это для чего-то подобного, то sudoвы можете ввести пароль только один раз, затем обернуть его bash -cили аналогичный.
Richlv

12

Раздел руководства bash под названием Составные команды имеет две опции: команды list и group.

Групповая команда - это серия команд, заключенных в фигурные скобки {}. Список такой же, заключенный в скобки (). И то, и другое можно использовать для фона нескольких команд внутри и, наконец, для фона всей коллекции в виде набора. Конструкция списка выполняет команды в подоболочке, поэтому назначение переменных не сохраняется.

Чтобы выполнить группу команд:

{ command1 & command2 & } &

Вы также можете выполнить свои команды в списке (подоболочке):

( command1 & command2 ) &

1
Пожалуйста. Я добавил ссылку на руководство. Обратите внимание, что ()синтаксис списка выполняет вложенные команды в подоболочке, поэтому переменные не сохраняются внутри.
Эли Хедри

3

по-другому:

$(command1 &) && command2 & 

Нет, он выполнит первую команду, затем после финиша первым, затем он выполнит другую команду
Рахул Патил

Вы использовали &&в своем вопросе, это означает, что сначала запустите команду, затем, если она выполнена успешно, запустите следующую команду. Если вы ее не считаете, вы можете запуститьcommand1 & ; command2 & ;
PersianGulf

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