executando o script com “. "E com" fonte "

25
  1. Eu queria saber se as duas maneiras a seguir de executar um script bash são equivalentes?

    . ./myScript.sh
    
    source myScript.sh
  2. Ambos estão executando o conteúdo do script em vez de executá-lo, ou seja, não criando um subshell para a execução do script?
Tim
fonte
11
Ei, isso está na página de manual!
alex
@alex: mostre-me por favor? man ., man sourceou o que eu ainda não sei.
Tim
2
Veja type .ehelp .
rozcietrzewiacz
man $SHELL,/source
alex
4
. é mais portátil de acordo com os outros.
L0b0

Respostas:

21
  1. Eles são equivalentes no bash, pois fazem exatamente a mesma coisa. Por outro lado, sourcetem 5 caracteres a mais e não é portátil para shells somente POSIX ou Bourne, enquanto .(ponto) é, então nunca me incomodo em usá-lo source.

  2. Isso está correto - o fornecimento de um arquivo executa os comandos no shell atual e isso afeta o ambiente atual do shell. Você ainda pode passar argumentos para o arquivo de origem e o bash realmente procurará $PATHo nome do arquivo como um comando normal se ele não contiver barras.


Não está relacionado à pergunta original de .vs source, mas no seu exemplo,

. ./myScript.sh 

não é idêntico a

source myScript.sh

porque while .e sourcesão funcionalmente idênticos myScript.she ./myScript.shnão são os mesmos. Como ./myScript.shcontém uma barra, ela é interpretada como um caminho e o shell apenas usa ./myScript.sh. No entanto, myScript.shnão tem uma barra, então o shell a $PATHprocura primeiro. Este é o comportamento padrão especificado para POSIX. . A maioria dos shells é padronizada para isso, embora possam adicionar extensões (como pesquisar no diretório de trabalho atual após a pesquisa de caminho) ou opções para alterar o comportamento de ./ source.

jw013
fonte
2
o comportamento quando o caminho fornecido do arquivo não contém um /depende do shell bashe zshdepende de o modo POSIX estar ativado ou não. Observe também que em muitas implementações do ksh, .comporta-se de maneira diferente source.
Stéphane Chazelas
@StephaneChazelas Sim, você está certo. Eu adicionei uma nota para esclarecer que a descrição acima é do padrão POSIX.
Jk013
8

Sim, eles são equivalentes. Não há diferença funcional; .é apenas um sinônimo interno para source.

(Edit: Aparentemente, isso só é verdade para bashe zshalgumas conchas mais leves não têm. source.é especificado por POSIX assim ksh, dash, ash, etc. pode não ter sourceSee. Resposta das jw013 para informações.)

Caleb
fonte
Obrigado! Mas $ alias .saídas bash: alias: .: not found .
Tim
Ou seja, ambos são embutidos e o alias também está embutido. Isso está documentado , mas acho que 'sinônimo' é o termo certo neste caso, não 'alias'.
Caleb