Группировка команд

Группировка команд

Я понимаю, что амперсанд &в конце последовательности команд выполняет ее в фоновом режиме (параллельно), точка с запятой ;позволяет выполнять ее последовательно (последовательно), а скобки позволяютгруппировка команд.

Предположим, у меня есть bashфайл с некоторыми командами:

#!/bin/bash
cmd1
cmd2
cmd3
cmd4

Если я хочу применить группировку команд, например, выполнить первые две команды параллельно, подождать, а затем выполнить следующие две команды параллельно, я должен указать:

#!/bin/bash
( \
cmd1 &
cmd2 &
); \
( \
cmd3 &
cmd4 & 
)

или все должно быть обязательно в одной строке?

#!/bin/bash
(cmd1 & cmd2 &);(cmd3 & cmd4 &)

или использовать везде символ продолжения строки?

#!/bin/bash
( \
cmd1 & \
cmd2 &); \
( \
cmd3 & \
cmd4 & )

решение1

просто используйте &иwait

cmd1 &
cmd2 &
wait
cmd3 &
cmd4 &
wait

wait будет ждать процесса backgroup.

Что касается продолжения строки, просто используйте (и ), обратите внимание, что это полезно только если у вас есть перенаправление.

(
cmd1 &
cmd2 &
wait
) > some-log.A
(
cmd3 &
cmd4 &
wait
) > some-log.B

обратите внимание, что без wait, подоболочка вернет управление немедленно.

date ; (
> sleep 20 &
> sleep 10 &
> ) ; date
Wed Nov 29 16:08:15 CET 2017
Wed Nov 29 16:08:15 CET 2017

по сравнению с

date ; (
> sleep 20 &
> sleep 10 &
> wait
> ) ; date
Wed Nov 29 16:10:08 CET 2017
Wed Nov 29 16:10:28 CET 2017

Связанный контент