Eu encontrei um problema de dor de cabeça.
Quero executar vários comandos em segundo plano, então quero iniciá-los no bash, um por um. É fácil iniciar um comando no linux shell em segundo plano, assim:
myCommand &
Também é fácil iniciar vários comandos, assim:
myCommand1 && myCommand2
ou
myCommand1 ; myCommand2
Mas se eu quiser executar vários comandos em segundo plano, tentei o seguinte formato de comando, mas falhei:
myCommand1 & && myCommand2 &
ou
myCommand1 & ; myCommand2 &
Ambos os formatos falham. Como posso executar vários comandos que possuem &
uma linha de comando?
command-line
bash
Relógio ZHONG
fonte
fonte
Respostas:
Usar ().
Se você deseja executá-los sequencialmente:
ou
Se você deseja que eles funcionem paralelamente:
No bash, você também pode usar isso (o espaço atrás de {e o; são obrigatórios):
fonte
(myCommand1 &) && (myCommand2 &)
funcionarámyCommand2
mesmo semyCommand1
falhar.Suponho que você queira o seguinte:
Isso inicia
myCommand1
e o envia para o plano de fundo conforme é seguido por "e comercial"; em seguida, iniciamyCommand2
e 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.
Vamos dividir isso em exemplos. Você pode criar uma lista combinando comandos e separando-os com um destes
; & && ||
: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:Isso pode ser bastante complicado, se você não tiver certeza do uso
true
efalse
testar se a construção funciona conforme o esperado:Job Control
O
jobs
comando 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:jobs
listafg
=%
coloca um processo em primeiro plano iniciando-o, se necessário, você pode especificar o processo da seguinte maneira:bg
=%&
coloca um processo em segundo plano, iniciando-o, se necessário:wait
aguarda a conclusão de um processo em segundo plano e retorna seu status de encerramento:Imagine que você iniciou um processo demorado (
jobs
revela o número 3) e depois percebe que deseja que o computador seja suspenso quando terminar, além deecho
uma mensagem se o processo não tiver êxito:fonte
man bash
) e amplamente utilizado exatamente como se destina AFAIK - nunca experimentei nada de estranho.