Eu entendo que o e comercial &
no final de uma sequência de comando a executa em segundo plano (em "paralelo"), o ponto e vírgula ;
permite sequencial (em "série") e o parêntese permiteagrupamento de comandos.
Suponha que eu tenha um bash
arquivo com alguns comandos:
#!/bin/bash
cmd1
cmd2
cmd3
cmd4
Se eu quiser aplicar agrupamento de comandos, por exemplo, executar os dois primeiros em paralelo, aguarde, depois execute os próximos dois em paralelo, devo colocar ?:
#!/bin/bash
( \
cmd1 &
cmd2 &
); \
( \
cmd3 &
cmd4 &
)
ou tudo deve ser obrigatório em uma única linha?
#!/bin/bash
(cmd1 & cmd2 &);(cmd3 & cmd4 &)
ou usando o caractere de linha continuar em todos os lugares?
#!/bin/bash
( \
cmd1 & \
cmd2 &); \
( \
cmd3 & \
cmd4 & )
Responder1
basta usar &
ewait
cmd1 &
cmd2 &
wait
cmd3 &
cmd4 &
wait
wait aguardará o processo de backgroup.
quanto à continuação de linha, basta usar (
and )
, observe que isso só é útil se você tiver redirecionamento.
(
cmd1 &
cmd2 &
wait
) > some-log.A
(
cmd3 &
cmd4 &
wait
) > some-log.B
observe que sem wait
, o subshell retornará imediatamente.
date ; (
> sleep 20 &
> sleep 10 &
> ) ; date
Wed Nov 29 16:08:15 CET 2017
Wed Nov 29 16:08:15 CET 2017
comparado com
date ; (
> sleep 20 &
> sleep 10 &
> wait
> ) ; date
Wed Nov 29 16:10:08 CET 2017
Wed Nov 29 16:10:28 CET 2017