Объединение в цепочку команды Bash

Я хотел бы выполнить объединенные в цепочку команды, но некоторые последовательны, и другие находятся в фоне.

Выполнение этой команды:

echo 1 && echo 2 & echo 3 && echo 4

Я хотел бы добраться:

1
2 (background)
3
4

Но я добираюсь:

3
4
1
2

Более реалистический пример:

compile &&
run server &  (background, used by tests below)
run test 1 &&
run test 2 &&
kill server

Как я могу сделать это с помощью удара?

Спасибо!

1
задан 28 April 2014 в 22:55

2 ответа

Я думаю, что то, что Вы просите:

echo 1 && { echo 2 & } && echo 3 && echo 4

В вышеупомянутом echo 1 выполнения на переднем плане, но echo 2 фон выполнений.

Примечание, которое && после echo 2 не может делать то, что Вы думаете. Рассмотрите:

$ echo 1 && { false & } && echo 3 && echo 4
1
[2] 28445
3
4

вышеупомянутые шоу, что echo 3 выполнения даже при том, что вторая команда false возвращает отказ. Это вызвано тем, что код возврата для фонового процесса не доступен, когда решение запуститься echo 3 принято.

Позволяют нам рассмотреть Ваш более реалистический пример:

compile && { run server & } && run test 1 && run test 2 && kill server

run test 1 запустится независимо от того, успешно выполнился ли run server или отказавший. Хуже, чем это, run test 1 может запуститься, прежде run server закончил настраивать сервер. Быстрое исправление должно задержаться run test 1 к достаточному количеству времени, когда Вы уверены, что run server закончил делать его установку:

compile && { run server & } && sleep 1 && run test 1 && run test 2 && kill server

, С другой стороны, необходимо было бы знать что-то [приблизительно 1 117] так, чтобы можно было протестировать его успешную установку.

Фон

  • фигурные скобки, {...}, создают список. Таким образом конструкция { echo 2 & } позволяет нам работать echo 2 с эффектом оператора &, ограниченного просто командами в списке.

  • && логичный удар и. Команда после эти && выполняется, только если предшествующая команда успешно выполняется, то есть, возвраты с кодом 0.

1
ответ дан 11 November 2019 в 12:47

Можно использовать nohup для выполнения команды в фоне: повторите 1 & & nohup повторяют 2 & & отзовитесь эхом 3

1
nohup: ignoring input and appending output to ‘nohup.out’
3
0
ответ дан 11 November 2019 в 12:47

Другие вопросы по тегам:

Похожие вопросы: