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


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.