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

30

Ao usar o bash shell, eu às vezes mantenho as variáveis de ambiente em um arquivo de texto que copio / colo o conteúdo de, 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

que teria o mesmo efeito que copiar / colar.

Qual é o mecanismo pelo qual este comando 'dot space filename' funciona? É difícil pensar em termos de pesquisa para isso.

Eu quero entender o que está acontecendo e os detalhes mais gerais do que esta frase está fazendo.

    
por iancoleman 19.10.2016 / 02:34

3 respostas

40

O comando . ("dot") é um sinônimo / atalho para o comando source interno do shell.

Faz com que o script de shell nomeado seja lido e executado dentro do contexto de shell atual (em vez de 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.

    
por 19.10.2016 / 03:18
26

Embora as duas respostas existentes já sejam excelentes, sinto o exemplo de que o efeito é o mais "perceptível", por assim dizer, está faltando.

Digamos que eu tenha um arquivo script.sh com o seguinte conteúdo:

cd dir

Se eu executasse este script normalmente ( sh script.sh ), eu veria isto:

olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$

Mas se eu for o local do script ( . script.sh ), acabaria com isso:

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 sua própria subshell (o processo sh começamos com o comando sh , isso poderia ser basicamente qualquer shell, bash , dash , você nomeia), ele muda de diretório lá, não faz nada e fecha. Enquanto o segundo exemplo é executado em nosso shell principal e, portanto, muda o diretório para lá!

    
por 19.10.2016 / 08:26
4

Aqui está um exemplo.

Arquivo de script: mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

se você tentar imprimir qualquer uma das variáveis acima, você não receberá nada

echo $myvar

mas se você fizer

. mytest.sh

ou

source mytest.sh

e depois

echo $myvar

imprimirá 1

Apenas uma resposta visual do que o Spiff escreveu

    
por 19.10.2016 / 04:18

Tags