Ao usar o shell bash, às vezes mantenho variáveis de ambiente em um arquivo de texto do qual copio/colo o conteúdo, por exemplo, exports.txt:
export FOO=bar
export FIZZ=buzz
Alguém me mostrou em vez de copiar/colar, eu poderia digitar no terminal
. exports.txt
o que teria o mesmo efeito que copiar/colar.
Qual é o mecanismo pelo qual esse comando 'dot space filename' funciona? É difícil pensar em termos de pesquisa para isso.
Quero entender o que está acontecendo e os detalhes mais gerais do que esse one-liner está fazendo.
Responder1
O .
comando ("ponto") é um sinônimo/atalho para o comando interno do shell source
.
Isso faz com que o script de shell nomeado seja lido e executado dentro do contexto de shell atual (em vez de em um subshell). Isso permite que o script de origem modifique o ambiente do shell de chamada, como definir variáveis e definir funções e aliases do shell.
Responder2
Embora as duas respostas existentes já sejam excelentes, sinto que falta o exemplo em que o efeito é mais "perceptível", por assim dizer.
Digamos que eu tenha um arquivo script.sh
com o seguinte conteúdo:
cd dir
Se eu executasse esse script normalmente ( sh script.sh
), veria isto:
olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$
Mas se eu encontrar o script ( . script.sh
), acabaria com isto:
olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$
Observe como no segundo caso o diretório de trabalho do nosso shell principal mudou!
Isso ocorre porque (como apontado nas outras respostas) o primeiro exemplo é executado em seu próprio subshell (o sh
processo que iniciamos com o sh
-command, poderia ter sido basicamente qualquer shell, bash
, dash
, você escolhe), ele muda de diretório lá, não faz nada e fecha. Enquanto o segundo exemplo é executado em nosso shell principal e, portanto, muda de diretório lá!
Responder3
Aqui está um exemplo.
Arquivo de script: meuteste.sh
cat mytest.sh
#!/bin/bash
myvar=1
mystring="Hello World"
se você tentar imprimir qualquer uma das variáveis acima você não obterá nada
echo $myvar
mas se você fizer isso
. mytest.sh
ou
source mytest.sh
e então
echo $myvar
ele imprimirá 1
Apenas uma resposta visual do que Spiff escreveu