Ao usar o bash shell, às vezes mantenho variáveis de ambiente em um arquivo de texto no qual copio / colo o conteúdo, por exemplo, export.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 esse comando 'dot space filename' funciona? É difícil pensar em termos de pesquisa para ele.
Eu quero entender o que está acontecendo e os detalhes mais gerais do que esta linha está fazendo.
help .
É tão curto que o mecanismo do Stack Exchange acha que é muito curto para ser um comentário.'. ' args
, com aspas simples ou duplas. Caso contrário, o espaço não citado é consumido pelo bash quando ele analisa a linha em tokens (consulte "divisão de palavras" no manual do bash)..
ésource
, que literalmente significa "comandos de origem deste arquivo", pelo menos para mim.Respostas:
O
.
comando ("ponto") é um sinônimo / atalho para o comando interno do shellsource
.Isso faz com que o script do shell nomeado seja lido e executado no contexto atual do shell (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.
fonte
source
é um sinônimo / atalho não padrão e não portátil para o comando "dot" ( ) definido pelo POSIX.
, e não o contrário.source
e um não padrão.
no modo não POSIX, os quais pesquisam o diretório atual, mesmo que não faça parte dele$PATH
. No modo POSIX, ele fornece um padrão.
que não pesquisa o diretório atual, e nãosource
. Em nenhum dos dois modos ésource
sinônimo de.
comando do POSIX .Embora as duas respostas existentes já sejam excelentes, sinto o exemplo em 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:Se eu rodasse esse script normalmente (
sh script.sh
), veria o seguinte:Mas se eu onde fonte o script (
. script.sh
), acabaria com isso:Observe como, no segundo caso, o diretório de trabalho do nosso shell principal mudou!
Isto porque (como fora apontado em outras respostas) O primeiro exemplo é executado em seu próprio subshell (o
sh
processo que começa com ash
-command, este poderia ter sido basicamente qualquer shell,bash
,dash
, o nome dele), ele muda diretório lá, não faz nada e fecha. Enquanto o segundo exemplo é executado em nosso shell principal e, portanto, altera o diretório lá!fonte
Aqui está um exemplo.
Arquivo de script: mytest.sh
se você tentar imprimir qualquer uma das variáveis acima, não receberá nada
mas se você fizer
ou
e depois
vai imprimir 1
Apenas uma resposta visual do que Spiff escreveu
fonte
export
é apenas se essas variáveis forem usadas em subshells. Eu poderia omitirexport
no arquivo se as variáveis fossem usadas apenas no shell atual. Isso esta certo?