De correr help .
ouhelp source
Execute comandos de um arquivo no shell atual.
Leia e execute comandos de FILENAME no shell atual. As entradas em $PATH são usadas para localizar o diretório que contém FILENAME.
Do meu ponto de vista, parece que o comando dot (ou o source
comando) está simplesmente executando um script de shell no contexto atual do shell (em vez de gerar outro shell).
Pergunta : por que .
(ou source
) não exige que o arquivo seja executável como quando você executa um script normal?
Digamos que eu tenha um script de shell (
my-script.sh
) começando com:Se o script tiver permissões de execução definidas, posso executar o script com:
Neste caso, você está pedindo ao kernel para ser executado
my-script.sh
como um programa, e o kernel (carregador de programa) verificará as permissões primeiro e, em seguida, usará/bin/sh ./my-script.sh
para realmente executar seu script.Mas o shell (
/bin/sh
) não se importa com as permissões de execução e não as verifica. Então se você chamar isso de...... O kernel nunca é solicitado a ser executado
my-script.sh
como um programa. O kernel (carregador de programa) é solicitado apenas a executar/bin/sh
. Portanto, as permissões de execução nunca serão verificadas. Ou seja, você não precisa de permissão de execução para executar um script como este.Para responder sua pergunta:
A diferença entre você chamar
./my-script.sh
e. ./my-script.sh
dentro de outro script é exatamente a mesma. No primeiro, você está pedindo ao kernel para executá-lo como um programa, no segundo, você está pedindo ao seu shell atual para ler comandos do script e o shell não precisa (ou se preocupa) com permissões de execução para fazer isso.Leitura adicional:
Executar scripts como programas é um comportamento surpreendente quando você pensa sobre isso. Eles não são escritos em código de máquina. Gostaria de ler sobre por que isso funciona; comece lendo sobre o shebang (
#!
) https://en.wikipedia.org/wiki/Shebang_(Unix)A execução de scripts com a notação de ponto é necessária para compartilhar variáveis. Todos os outros mecanismos para execução iniciam um novo "contexto" de shell, o que significa que quaisquer variáveis definidas no script chamado não serão passadas de volta para o script de chamada. A documentação do Bash é um pouco leve, mas está aqui: https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html
Quando você diz
source script.sh
ou. script.sh
nunca está executando o script. O que você está executando é um comando shellsource
que faz alguma coisa. Esse "algo" inclui a leitura de script.sh e a execução do que foi lido. Seu script precisa ser legível para isso. Não há necessidade de executável.O comportamento é semelhante à execução
bash non-executable-script.sh
oupython non-executable-script.py
etc.