Se eu tiver um arquivo com
cmd1
cmd2
cmd3
E eu quero executá-los independentemente um do outro, e independentemente de gerar um status de saída ou não (isso significa que não espere terminar, apenas continue iniciando processos, que podem falhar ou não. Eu sei que isso ;
executaria o próximo comando, mas não é o caso, porque espera até que o comando anterior falhe ou seja bem-sucedido. Quero iniciar todos os comandos de uma vez.
É algo como sleep 60m
; e depois tocar música, tocar uma campainha, rodar o navegador, mas obviamente, não há como esperar até que a música toque para tocar uma campainha, e depois disso rodar o navegador. Tem que acontecer de uma vez.
ADICIONADO: como, por exemplo,
ler as linhas do arquivo, abrir um terminal para cada linha e executá-lo?
Responder1
Simplesmente adicionar um E comercial ao final de cada linha irá bifurcar todos os comandos em segundo plano.
cmd1 &
cmd2 &
cmd3 &
Exemplo
$ more at_once.bash
#!/bin/bash
echo "1" && sleep 10 &
echo "2" && sleep 10 &
echo "3" && sleep 10 &
pgrep -a sleep
Agora, quando executamos este script:
$ ./at_once.bash
1
3
2
7533 sleep 10
7535 sleep 10
7536 sleep 10
Você pode até ver que as tarefas foram executadas fora de ordem devido à sua natureza em segundo plano, com o terceiro comando sendo repetido antes do segundo. O pgrep sleep
mostra que todos os três comandos em segundo plano estão sendo executados ao mesmo tempo.
OBSERVAÇÃO:Usei a notação echo "X" && sleep 10
simplesmente para mostrar que os comandos estavam sendo executados em segundo plano. Esta notação não tem nada a ver com o fundo em si, o rastro &
é o que "coloca" os sleep 10
comandos em segundo plano.
Você também pode usar &
como separador se preferir fazer isso em uma única linha de comando:
$ sleep 10 & sleep 10 & sleep 10 &
[1] 7731
[2] 7732
[3] 7733
Verificando este forro:
$ pgrep -a sleep
7731 sleep 10
7732 sleep 10
7733 sleep 10
Novamente vemos todos eles funcionando simultaneamente. Se você usasse ponto e vírgula:
$ sleep 10 ; sleep 10 ; sleep 10
Os sleep 10
comandos seriam executados em série, levando 30 segundos para serem concluídos, versus em paralelo, levando apenas 10 segundos.