Respostas:
Um ponto nesse contexto significa "originar" o conteúdo desse arquivo no shell atual. Com source
si ser um comando shell builtin. E source
o operador de ponto sendo sinônimos.
Digamos que eu tenha o seguinte conteúdo em um sample.sh
arquivo.
$ cat sample.sh
echo "hi"
echo "bye?"
Agora, quando eu fonte:
$ . sample.sh
hi
bye?
$
Arquivos como esse costumam ser usados para incorporar comandos de instalação, como adicionar itens às variáveis de ambiente.
Digamos que eu tenha esses comandos em outro arquivo addvars.sh
,.
$ cat addvars.sh
export VAR1="some var1 string"
export VAR2="some var2 string"
Observe que eu não tenho nenhuma variável no ambiente do meu shell atual.
$ env | grep VAR
$
Agora, quando eu fonte este arquivo:
$ . addvars.sh
$
OK, parece que não fez nada, mas quando verificamos as env
variáveis novamente:
$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
Para adicionar à resposta do slm:
Existem duas maneiras de executar um script de shell. Uma é executar o script em um processo separado, o que significa que qualquer coisa sobre o ambiente do shell (estado da memória) reverterá para o estado do shell "pai" antes de executar o processo do shell "filho".
Por exemplo, o diretório de trabalho atual (o local no sistema de arquivos em que se encontra) é determinado por processo. Então, vamos ter um script parecido com este:
#!/bin/bash
cd ~
cd ..
pwd
Então, vamos chamar esse script, oh foo
,. E vamos executar este script da seguinte maneira:./foo
Veremos o seguinte:
/home
(Exclusão de responsabilidade padrão de que há um grande número de distribuições de clones do Linux e do UNIX disponíveis no mercado, algumas das quais não colocam os diretórios do usuário /home
. Ou, como costumávamos dizer "Sua milhagem pode variar")
Agora, depois de executar este script, vamos digitar este comando
pwd
Para ver em que diretório estamos. Vamos ver algo assim:
/home/username
O motivo é que, novamente, o script de shell que executamos tinha seu próprio ambiente (incluindo seu próprio diretório onde os comandos estavam sendo executados), e esse ambiente desapareceu assim que o script terminou de ser executado.
Agora, vamos executar o foo
script assim
. ./foo
Ou equivalente:
source ./foo
Se fizermos um pwd
depois, veremos o seguinte:
/home
O motivo é que: fornecer um script não chama um processo separado. É como digitar todos os comandos no processo pai manualmente; seu ambiente é preservado após o término do script.
Deixe-me apresentar um exemplo mais simples. Vamos ter um script parecido com este:
#!/bin/bash
exit
Vamos nomear foo
. Vamos ter certeza de que pode executá-lo: chmod 755 foo
. Então, vamos rodar assim:
./foo
Nada acontece. No entanto, por outro lado, se fizermos isso:
. ./foo
Ou isto:
source ./foo
Nós terminamos a sessão.
# type .
. is a shell builtin
# help .
.: . filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
. (operador de origem ou ponto)
Leia e execute comandos a partir do argumento filename no contexto atual do shell.
Syntax
. filename [arguments]
source filename [arguments]
source é sinônimo de ponto / período '.' no bash, mas não no POSIX sh, portanto, para obter a máxima compatibilidade, use o período.
Quando um script é executado usando a origem, ele é executado no shell existente, todas as variáveis criadas ou modificadas pelo script permanecerão disponíveis após a conclusão do script. Por outro lado, se o script for executado exatamente como o nome do arquivo, um subshell separado (com um conjunto de variáveis completamente separado) será gerado para executar o script.
Há uma diferença sutil entre executar um script executando .ss64script (ponto ss64script) e. ss64script (espaço em ponto ss64script)
a primeira está executando um arquivo que foi oculto no comando 'ls' (embora ls -a mostre arquivos ocultos) a segunda opção executa o ss64script, mesmo que não tenha sido definido como executável no chmod.
TL; DR
O ponto é o mesmo que o comando de origem.
source é um comando Unix que avalia o arquivo após o comando, como uma lista de comandos, executada no contexto atual.
Extraído de https://en.wikipedia.org/wiki/Source_(command)