Resposta curta: o sourcing executará os comandos no processo atual do shell. executar executará os comandos em um novo processo de shell. ainda confuso? então por favor continue lendo a resposta longa.
Terminologia:
Para esclarecer algumas confusões comuns sobre a sintaxe a ser executada e a sintaxe para a origem:
./myscript
Execute myscript
, desde que o arquivo seja executável e localizado no diretório atual. A barra de pontos à esquerda ( ./
) indica o diretório atual. Isso é necessário porque o diretório atual geralmente não está em $PATH
.
myscript
Execute myscript
se o arquivo for executável e localizado em algum diretório em $PATH
.
source myscript
Origem myscript
. o arquivo não precisa ser executável, mas deve ser um script de shell válido. O arquivo pode estar no diretório atual ou em um diretório em $PATH
.
. myscript
Origem myscript
. Essa sintaxe é definida pelo POSIX . Bash definiu source
como um apelido para o comando dot.
Demonstração:
Considere myscript.sh
com o seguinte conteúdo:
#!/bin/sh
# demonstrate setting a variable
echo "foo: "$(env | grep FOO)
export FOO=foo
echo "foo: "$(env | grep FOO)
# demonstrate changing of working directory
echo "PWD: "$PWD
cd somedir
echo "PWD: "$PWD
Antes de executarmos o script primeiro, verificamos o ambiente atual:
$ env | grep FOO
$ echo $PWD
/home/lesmana
A variável FOO
não está definida e estamos no diretório inicial.
Agora, executamos o arquivo:
$ ./myscript.sh
foo:
foo: FOO=foo
PWD: /home/lesmana
PWD: /home/lesmana/somedir
Verifique o ambiente novamente:
$ env | grep FOO
$ echo $PWD
/home/lesmana
A variável FOO
não está definida e o diretório de trabalho não foi alterado.
A saída do script mostra claramente que a variável foi definida e o diretório foi alterado. A verificação depois mostra que a variável não está definida e o diretório não foi alterado. O que aconteceu? As alterações foram feitas em um shell novo . O shell atual gerou um shell new para executar o script. O script está sendo executado no novo shell e todas as alterações no ambiente entram em vigor no novo shell. Depois que o script é feito, o novo shell é destruído. Todas as alterações no ambiente no novo shell são destruídas com o novo shell. Apenas o texto de saída é impresso no shell atual.
Agora nós fornecemos o arquivo:
$ source myscript.sh
foo:
foo: FOO=foo
PWD: /home/lesmana
PWD: /home/lesmana/somedir
Verifique o ambiente novamente:
$ env | grep FOO
FOO=foo
$ echo $PWD
/home/lesmana/somedir
A variável FOO é definida e o diretório de trabalho foi alterado.
O fornecimento do script não cria um novo shell. Todos os comandos são executados no shell atual e as alterações no ambiente entram em vigor no shell atual.
Note que neste exemplo simples a saída da execução é a mesma que a do script. Isso nem sempre é necessariamente o caso.
Outra demonstração:
Considere o seguinte script pid.sh
:
#!/bin/sh
echo $$
(a variável especial $$
se expande para o PID do processo atual do shell em execução)
Primeiro, imprima o PID do shell atual:
$ echo $$
25009
fonte do script:
$ source pid.sh
25009
Execute o script, observe o PID:
$ ./pid.sh
25011
Fonte novamente:
$ source pid.sh
25009
Execute novamente:
$ ./pid.sh
25013
Você pode ver que a origem do script é executada no mesmo processo, enquanto a execução do script cria um novo processo toda vez. Esse novo processo é o shell novo que foi criado para a execução do script. O fornecimento do script não cria um novo shell e, portanto, o PID permanece o mesmo.
Resumo
Tanto o fornecimento quanto a execução do script executarão os comandos no script linha por linha, como se você tivesse digitado esses comandos manualmente linha por linha.
As diferenças são:
- Quando você executa o script que está abrindo um novo shell, digite os comandos no novo shell, copie a saída de volta ao seu shell atual e feche o novo Concha. Quaisquer alterações no ambiente entrarão em vigor somente no novo shell e serão perdidas quando o novo shell for fechado.
- Quando você fonte o script você está digitando os comandos em seu atual shell. Quaisquer alterações no ambiente entrarão em vigor e permanecerão no seu shell atual.
Use a origem se você quiser que o script altere o ambiente no seu shell atualmente em execução. use executar de outra forma.
Veja também: