Suponho que você queira o seguinte:
myCommand1 & myCommand2 &
Isso inicia myCommand1e o envia para o plano de fundo conforme é seguido por "e comercial"; em seguida, inicia myCommand2e envia imediatamente também para o plano de fundo, liberando o shell novamente.
Listas
Para um melhor entendimento, você pode substituir o pipeline por comando aqui.
Uma lista é uma sequência de um ou mais pipelines separados por um dos operadores ; , & , && , ou || e opcionalmente encerrado por um de
; , & ou .
Se um comando é finalizado pelo operador de controle & , o shell executa o comando em segundo plano em uma subshell. O shell não espera o comando terminar e o status de retorno é 0. Comandos separados por a ; são executados sequencialmente; o shell aguarda que cada comando termine por sua vez. O status de retorno é o status de saída do último comando executado.
As listas AND e OR são sequências de um ou mais pipelines separados pelos && e || operadores de controle, respectivamente.
Fonte:man bash
Vamos dividir isso em exemplos. Você pode criar uma lista combinando comandos e separando-os com um destes ; & && ||:
command1 ; command2 # runs sequentially
command1 && command2 # runs sequentially, runs command2 only if command1 succeeds
command1 || command2 # runs sequentially, runs command2 only if command1 fails
command1 & command2 # runs simultaneously
Você pode encerrar listas com um destes: ; & <newline>.
Normalmente você executa um comando ou uma lista pressionando Enter, que é igual <newline>. O ponto e vírgula ;serve ao mesmo propósito, especialmente em scripts. E comercial, &no entanto, inicia o (s) comando (s) em um subshell em segundo plano, liberando imediatamente o shell.
Você pode usar ()colchetes redondos ou cacheados {}para listas de grupos adicionais, a diferença é que os colchetes geram um subshell e os cacheados não. Os colchetes precisam de um espaço após o primeiro e um ponto-e-vírgula ou uma nova linha antes do colchete de fechamento. Por exemplo:
# if c1 succeeds start a shell in the background
# and run c2 and c3 sequentially inside it
c1 && ( c2 ; c3 ) &
# run c1 and if it succeeds c2 sequentially as a group command
# if c1 or c2 fail run c3 in the background
{ c1 && c2 ;} || c3 &
Isso pode ser bastante complicado, se você não tiver certeza do uso truee falsetestar se a construção funciona conforme o esperado:
$ { true && true ;} || echo 2
$ { true && false ;} || echo 2
2
Job Control
O jobscomando exibe uma lista dos trabalhos em segundo plano que estão em execução ou foram concluídos recentemente no shell atual. Existem vários atalhos de teclado e comandos para controle de tarefas:
- Ctrl+ Zdigita o caractere de suspensão que faz com que o processo atualmente em execução no primeiro plano seja parado, ele não é finalizado, mas permanece na
jobslista
- Ctrl+ Ydigita o caractere de suspensão atrasada que faz com que o processo atualmente em execução no primeiro plano seja interrompido quando ele tenta ler a entrada do terminal
fg= %coloca um processo em primeiro plano iniciando-o, se necessário, você pode especificar o processo da seguinte maneira:
% # last process in the jobs list
%1 # 1st process in the jobs list
%abc # process beginning with the string “abc”
%?abc # process containing the string “abc” anywhere
bg= %&coloca um processo em segundo plano, iniciando-o, se necessário:
%& # last process in the jobs list
%1& # 1st process in the jobs list
%abc& # process beginning with the string “abc”
%?abc& # process containing the string “abc” anywhere
wait aguarda a conclusão de um processo em segundo plano e retorna seu status de encerramento:
wait %1 # 1st process in the jobs list
Imagine que você iniciou um processo demorado ( jobsrevela o número 3) e depois percebe que deseja que o computador seja suspenso quando terminar, além de echouma mensagem se o processo não tiver êxito:
wait %3 || echo failed ; systemctl suspend