Як запустити декілька фонових команд в bash в одному рядку?


169

Я зазвичай запускаю кілька команд приблизно так:

sleep 2 && sleep 3

або

sleep 2 ; sleep 3

але що робити, якщо я хочу запустити їх обидва у фоновому режимі з однієї команди командного рядка?

sleep 2 & && sleep 3 &

не працює. І не замінює &&на;

Чи є спосіб це зробити?


8
Використовуйте ()для оточення команди.
nhahtdh

Відповіді:


318

Як саме ти хочеш, щоб вони працювали? Якщо ви хочете, щоб їх запускали у фоновому режимі та виконували послідовно , ви зробите щось подібне:

(sleep 2; sleep 3) &

Якщо, з іншого боку, ви хочете, щоб вони працювали паралельно у фоновому режимі, ви можете зробити це:

sleep 2 & sleep 3 &

І дві техніки можна поєднувати, такі як:

(sleep 2; echo first finished) & (sleep 3; echo second finished) &

Баш, будучи баш, часто існує безліч різних прийомів виконання одного і того ж завдання, хоча іноді з тонкими відмінностями між ними.


20
Це лаконічна, продумана відповідь, яка "вчить людину рибалити" на все життя. Дякую.
ambrus

2
Що станеться, якщо ми це зробимо sleep 2 && sleep 3 &? Я спробував це в bash, і, здається, працює так само (пробував із відлунням).
Wajahat

@HakanBaba, так, це дійсно створює нижню частину корпусу на задньому плані.
Дуве ван дер

3
@Wajahat, ти спробував sleep 2 && echo "foo" && sleep 3 & echo "bar""? &&Оператор каже оболонці , щоб виконати команду перед ним, і тільки тоді , коли ця команда виконується без будь - яких помилок оболонка виконує наступну команду. Це по суті відрізняється від ;, оскільки ;дозволяє наступній команді виконувати незалежно від стану виходу попередньої команди, якщо тільки це не була фатальною помилкою. &Каже оболонці , щоб виконати всі «Connected» команд , що передують його, у фоновому режимі. "З'єднаний" тут означає, що команда є частиною pipe ( |) або логічним оператором.
Дуве ван дер

Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.в баш-посібнику.
jinbeom hong

49

Вам потрібно додати кілька паренів в останню версію -

(sleep 2 &) && (sleep 3 &)

або це також працює -

(sleep 2 &) ; (sleep 3 &)

Примітка. Коли список використовується з &, його статус виходу завжди дорівнює нулю. Отже, два вищевикладені випадки роблять те саме (оболонка виконує обидві сторони по черзі асинхронно ).
jinbeom hong

9

для виконання декількох фонових команд потрібно додати &кінець кожної команди. колишній: (command1 &) && (command2 &) && (command3 &)


5

У відповідях вище використовуються круглі дужки. Bash також може використовувати брекети з подібною метою:

{ sleep 2 && sleep 3; } &

Зауважте, що дужки є більш вибагливими щодо синтаксису - пробіл після {, пробіл перед }та заключна крапка з комою потрібні. У деяких ситуаціях брекети є більш ефективними, оскільки вони не розщеплюють нову підзаглушку. У цьому випадку я не знаю, чи має це значення.


1
Про що { sleep 2; sleep 3; } &?
Кенні Евітт

4

Це працює:

$(sleep 2 &) && sleep 3 &

Також ви можете:

$(sleep 2 && sleep 3) &

0

У мене теж така ж місія. Я спробував (sleep2 ; fg )& sleep3 ; fg, це працює. І коли ви попередньо встановіть ctrl + c удвічі, два процеси можна зупинити.


0

Ви можете використовувати заміну команди bash $(command)таким чином:

$(command1 ; command2) &

Зауважте, що stdin і stdout все ще пов'язані з батьківським процесом, і перенаправлення принаймні stdout може бути складним. Таким чином, ви можете зв'язати команди в одному рядку, після чого передати рядок до bashкоманди, щоб породити новий процес, який буде обробляти виконання.

bash -c "command1 ; command2" & 

Це особливо корисно в скрипті bash, коли потрібно запустити кілька команд у фоновому режимі.

Ці два твердження повинні бути рівнозначними. Процес bash створюється в обох випадках для обробки команд (ланцюжок команд) та& в кінці відокремлює виконання.

Цього разу ви можете додати &>/dev/nullдо &завершення команди в кінці команди, щоб перенаправити принаймні stdout та уникнути виводу на stdout батьківського процесу. Щось на зразок:

bash -c "command1 ; command2" &>/dev/null &

-1

Якщо потрібно запустити кілька команд послідовно , існує дійсно простий метод, який працює скрізь: Створення файлу! Перевага цього методу в тому, що він чистий і простий.

Спочатку створіть свій файл з ім'ям, наприклад commands.sh. Потім покладіть свої команди туди. Ось зразок:

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;

Гаразд, зараз ми на останньому кроці. Щоб запускати команди у фоновому режимі (послідовно), просто запустіть:

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