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?

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.


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.)


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.