Aprenda a diferença entre o fornecimento e a bola no Bash

Aprenda a diferença entre o fornecimento e a bola no Bash

O foco principal deste artigo é entender claramente o que acontece quando você executa o Script vs fonte o script em Bash. Primeiro, entenderemos claramente como o programa é enviado quando você chama o script de maneiras diferentes.

OBSERVAÇÃO: Criar o script com uma extensão não importa. O script funcionará bem mesmo sem extensões.

Basicamente, todo script começa com uma linha chamada A Shebang (#!). O Cerquilha Símbolo em Bash será interpretado como comentários, mas Shebang tem um significado especial. Diz a Bash para enviar o programa em qualquer intérprete que você mencionou Shebang.

Abaixo estão um programa de amostra e estou especificando o Bash como meu intérprete.

$ cat >> hello_world.sh #!/usr/bin/Env Bash Echo "Hello World" $ chmod +x hello_world.sh 

Agora, para executar o script, você pode fazer isso de duas maneiras.

  • Use um caminho relativo para chamar o script. Mova para o diretório onde o script está presente e corra ./Olá Mundo.sh.
  • Use o caminho absoluto para chamar o script. De qualquer lugar do sistema de arquivos, digite o caminho completo para o script.
$ ./Olá Mundo.sh $ pwd $/home/karthick/hello_world 
Execute script de shell

Agora vamos ver o que acontece quando você tenta enviar seu programa sem Shebang. Na ausência de Shebang, O programa será enviado a qualquer shell atual com o qual você esteja executando, no meu caso, é Bash (/BIN/BASH).

Deixe -me demonstrar um exemplo. Estou criando um script python sem Shebang E quando eu chamo o programa, Bash Não sabe que ele deve enviar este programa para o intérprete Python, em vez disso, ele executará o programa no shell atual.

$ cat> run-py.py eco $ shell print ("hello world") $ chmod +x run-py.py $ ./run-py.py 
Intérprete errado no script

Nesse caso, você pode ligar para o programa mencionando em qual intérprete ele deve ser enviado ou apenas adicionar o Shebang linha que é sempre recomendada.

# qual python3 $ (que python3)/home/karthick/run_py.py 
Ligue para o script com intérprete

Agora que você sabe como chamar o script, o próximo passo seria entender o que acontece quando chamamos o script. Quando você invoca o script, como mostrado nos exemplos acima, ele criará um processo infantil (bifurcação) e o script será enviado ao processo infantil. Eu executei um script de amostra que apenas executará o seguinte comando e mostra que o script é enviado a um processo infantil.

$ ps -ef -Forest | Grep -i Bash 
Bifurcação

Pode haver vários processos infantis como parte do script e isso depende do nosso código. Deve -se notar que as variáveis ​​ambientais criadas pelo subscrito serão descartadas assim que terminar. Um processo infantil pode acessar variáveis ​​criadas pelo processo pai, exportando -as. Mas o processo pai não pode acessar as variáveis ​​criadas pelo processo infantil.

Dê uma olhada nos artigos abaixo para entender mais sobre como as variáveis ​​funcionam e como exportar as variáveis.

  • Entendendo e escrevendo 'variáveis ​​Linux' em scripts de shell
  • Aprenda a diferença entre $$ e $ Bashpid em Bash

Fornecendo o script

““Fonte”É um comando interno do shell que lê o arquivo passado como um argumento e executa o código no ambiente de shell atual. Um caso de uso apropriado que você usa principalmente é modificar sua configuração em .Bashrc ou .Bash_profile e recarregar as mudanças usando o Comando de origem.

$ type -uma fonte 
Comando de Shell Builtin

Existem duas maneiras sintáticas de executar o Comando de origem. Você pode escolher qualquer pessoa entre duas sintaxes e é de escolha pessoal.

$ fonte file_name [argumentos] $ . File_name [argumentos] 

Deixe -me demonstrar como a fonte realmente funciona. Vou criar dois scripts de shell. O primeiro script (Módulo.sh) vai manter algumas variáveis ​​e funções. O segundo script (Principal.sh) vai imprimir a variável e chamar a função.

Arquivo Módulo.sh.

#!/usr/bin/Env Bash var1 = $ (echo "welcome to $ 1") função f1 () echo “função f1 é chamada” 

Arquivo Principal.sh.

#!/usr/bin/Env Bash eco $ var1 f1 
Códigos de script de amostra

Defina a permissão de execução para o script e ligue para o script principal "principal.sh ”. Agora, este script tentará encontrar a função F1 e variável VAR1 no ambiente atual do shell e falhará com o comando não encontrado.

$ Bash Main.sh 
Antes de adquirir o script

Agora vamos executar o comando de origem dentro do script que carregará a variável e funciona no ambiente atual do shell e que serão acessíveis por "principal.sh ”.

Arquivo Módulo.sh.

#!/usr/bin/Env bash var1 = $ (echo "welcome to $ 1") função f1 () eco "a função f1 é chamada" 

Arquivo Principal.sh.

#!/usr/bin/Env Bash Fonte Módulo.sh tecmint echo $ var1 f1 
Amostra de códigos de script com fornecimento

Agora execute o script novamente e veja.

$ Bash Main.sh 
Depois de adquirir o script

O fonte é muito útil em Bash Para seguir a abordagem de programação modular na criação de nossos scripts de shell. Podemos dividir nosso código em módulos menores e pode ser usado em muitos programas. Dessas maneiras, podemos seguir o SECO (Não se repita) Princípio.

É isso para este artigo. Discutimos brevemente a diferença entre o fornecimento e a bobina em Bash. Passe pelo artigo e compartilhe seu feedback valioso conosco.