O que o comando 'dot space filename' está fazendo no bash?

O que o comando 'dot space filename' está fazendo no bash?

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.shcom 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 shprocesso 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

informação relacionada