Script Bash com scripts menores internamente

4

Eu tenho uma sequência de pequenos scripts bash que preciso executar em uma ordem específica.

Eu imaginei que poderia fazer isso criando um script que executa cada script, um após o outro, porque a maioria dos scripts recebe entrada dos arquivos de saída do anterior.

No entanto, quando tento executar o script, ele tenta executar cada um dos scripts internos de uma só vez e retorna muitos erros no such file or directory .

Eu tenho meu script formatado assim.

#!/bin/bash
bash script1.sh
bash script2.sh
bash script3.sh 

E eu não quero executar script2.sh até que o script1.sh tenha terminado a execução. Existe uma maneira simples de fazer isso?

Edit: Eu esqueci de mencionar que eu tenho alguns scripts python na lista também. Não tenho certeza se isso muda alguma coisa.

    
por Louis 21.08.2017 / 21:13

4 respostas

7

A solução correta para você depende do que você deseja:

  • A combinação dos scripts com && só executará o segundo se o primeiro sair com êxito
  • A combinação dos scripts com || só executará o segundo se o primeiro não sair com êxito

Se você deseja que o segundo comando seja executado após o primeiro independentemente de se ele sai com êxito ou não, use ; ou & wait :

bash script1.sh ;
bash script2.sh & wait
bash script3.sh
    
por dessert 21.08.2017 / 21:35
3

Você pode tentar pesquisar os scripts

#!/bin/bash
. script1.sh
. script2.sh
. script3.sh

Se houver variáveis que devem ser removidas após cada script, coloque-o entre parênteses, por exemplo

#!/bin/bash
(
    . script1.sh
)
(
    . script2.sh
)
(
    . script3.sh
)

Outra possibilidade é chamar os scripts diretamente:

#!/bin/bash
./script1.sh
./script2.sh
./script3.sh

Se você quiser que todos os processos em segundo plano gerados pelos scripts sejam concluídos, adicione wait para esperar por eles

por exemplo,

./script1.sh
wait
./script2.sh

Sua solução atual está sendo executada simultaneamente, pois bash abre um novo shell e executa isso

    
por AvdnhracNTAd9ex 21.08.2017 / 21:21
1

Faça isso desta maneira.

bash script1.sh && bash script2.sh && bash script3.sh

Ou desta forma:

bash script1.sh &&
bash script2.sh &&
bash script3.sh

Isso garantirá que, se o script anterior sair com sucesso, o próximo script será executado.

Ou use ; , em vez disso, se você precisar executar o próximo script, além do script anterior, ele saiu bem ou mal.

bash script1.sh ; bash script2.sh ; bash script3.sh
    
por αғsнιη 21.08.2017 / 21:16
0

Adicione set -e ao início de todos os scripts. Quando essa opção está ativada, qualquer comando que falhar, fará com que todo o script falhe, como acontece com os comandos separados por '& amp; & amp;'. a especificação

"a maioria dos scripts recebe entrada dos arquivos de saída dos anteriores" soa como o que make serve. Considere usá-lo.

    
por pj-yn9aq 22.08.2017 / 06:46