Qual é a diferença entre executar um script como este:
./test.sh
e executando um script como este:
. test.sh
?
Tentei um script simples de duas linhas para verificar se havia alguma diferença:
#!/bin/bash
ls
Mas ambos . test.sh
e ./test.sh
retornou a mesma informação.
test.sh
não é o mesmo que./test.sh
(o primeiro invoca umaPATH
pesquisa), assim são. test.sh
e. ./test.sh
diferente da mesma forma (o antigo invoca umaPATH
pesquisa). Muitos shells parecem incluir implicitamente.
no final dePATH
uma.
pesquisa de caminho, mas esse comportamento não é padrão. Assim, é mais preciso para comparartest.sh
vs. test.sh
e./test.sh
vs. ./test.sh
.Respostas:
./test.sh
é executadotest.sh
como um programa separado. Pode ser um script bash, se o arquivotest.sh
começar com#!/bin/bash
. Mas poderia ser algo completamente diferente.. ./test.sh
executa o código do arquivotest.sh
dentro da instância em execução do bash. Funciona como se o arquivo de conteúdotest.sh
tivesse sido incluído textualmente em vez da. ./test.sh
linha. (Quase: existem alguns detalhes que diferem, como o valor de$BASH_LINENO
e o comportamento doreturn
componente interno.)source ./test.sh
é idêntico ao. ./test.sh
bash (em outros shells,source
pode ser um pouco diferente ou não existir completamente;.
pois a inclusão está no padrão POSIX).A diferença mais visível entre executar um script separado
./test.sh
e incluir um script com o.
builtin é que, se otest.sh
script definir algumas variáveis de ambiente, com um processo separado, apenas o ambiente do processo filho será definido, enquanto que com a inclusão do script, o ambiente do processo único shell está definido. Se você adicionar uma linhafoo=bar
notest.sh
eecho $foo
no final do script de chamada, você vai ver a diferença:fonte
echo $$
ao script também mostrará a diferença bastante clara. A$$
variável mantém o PID do shell atual.. ./test.sh
chamada de outro script de shell para usar funções descritas em test.sh. Quero dizer, não são apenas as variáveis que você pode definir, você também pode criar novas funções dessa maneira que são chamadas pelo bash ou algum outro script.. /usr/libexec/company/tools; custom_command "variable
"A execução de um script da primeira maneira o executa como um processo filho. A terceirização (por outro lado), por outro lado, executa o script como se você inserisse todos os seus comandos no shell atual - se o script definir uma variável, ele permanecerá definido, se o script sair, sua sessão será encerrada. Veja
help .
para documentação.fonte
Outra coisa que observo é que, se você tiver um alias como este:
Com isso,
./test.sh
você obterá umals
saída normal (e um PID diferente do shell atual):Com
. test.sh
ou. ./test.sh
você obterá uma saída mais detalhada (e o mesmo PID que o shell atual):fonte
.bashrc
if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi
Em seguida, insira seus aliases.bash_aliases
.alias
palavra - chave? (Talvez seja apenas um erro em você borne - na linha 3?)O principal uso para mim para
source
(ou.
) são as funções do bash .Eu tenho scripts com muitas funções e executo todos eles com o meu
.bashrc
. As funções "se tornam" comandos, que eu uso com frequência.fonte