Qual é o propósito de “source” (.) como um comando de shell?

5

Qual é a diferença entre esses dois comandos?

. filename            # (A)

e

filename              # (B)

E como este comando está relacionado?

./filename            # (C)

Nota: O # e o resto da linha depois são comentários.

    
por Dennis Williamson 05.07.2009 / 14:59

4 respostas

16

O comando (A) é chamado de fonte do arquivo, que consiste em comandos do shell. Ele não pode ser usado para executáveis binários (consulte man file para obter informações sobre como determinar o tipo de um arquivo). Isso faz com que os comandos no arquivo sejam executados no ambiente atual como se eles tivessem sido digitados no prompt do shell. Os resultados afetam o ambiente atual e, portanto, podem fazer coisas como definir o valor de variáveis de ambiente e alterar diretórios, incluindo definições de funções, entre outras coisas. Não é necessário definir o bit de execução usando chmod. O arquivo precisa estar no diretório atual ou um caminho completo ou relativo * deve ser incluído ou o arquivo pode estar em um local que esteja na variável de ambiente PATH (sujeito a se a opção sourcepath de shopt está definida ). Não é necessário especificar o diretório atual se é onde o arquivo está localizado. Estes são todos equivalentes:

$ ls
filename
$ . filename
results

$ ls /some/directory/filename
/some/directory/filename
$ . /some/directory/filename
results

$ cd /elsewhere
$ echo $PATH
/some/directory
$ . filename
results

O comando (B) faz com que o shell execute o arquivo apenas se o bit de execução estiver ativado para os direitos do usuário (consulte man chmod ). O arquivo pode ser um script de shell, um executável binário ou outro script, como Perl ou Python (ou escrito em um shell diferente). Se não houver nenhuma barra no nome (nenhum diretório é especificado), o arquivo deverá estar localizado em um diretório incluído na variável de ambiente PATH . É possível incluir o diretório atual no caminho, mas não o recomendo porque é um risco de segurança. Estes são equivalentes:

$ echo $PATH
/some/directory
$ filename
results

$ /some/directory/filename
results

O comando (C) é essencialmente o mesmo que o comando (B), mas especifica o diretório atual que é referido como "." (assim como o diretório pai é referido como "..". O PATH não será pesquisado para localizar o arquivo desde que um diretório seja especificado.

[*] Um caminho relativo é aquele que não inicia com uma barra (/). Especifica uma localização relativa ao diretório atual. "this / is / a / subdir" existe como um caminho de diretório sob o atual como "./this/is/a/subdir" (que especifica o mesmo diretório). "../another/set/of/dirs" é um conjunto de diretórios abaixo do pai do atual.

    
por 05.07.2009 / 15:00
7

Se você pesquisar um script com

# . script

ou

# source script

significa que o script é executado no shell atual.

Se você correr

# ./script

Ele será executado em um novo shell e não terá acesso a variáveis definidas no shell atual que não foram exportadas para o ambiente com "export".

    
por 05.07.2009 / 15:19
2

O uso do ". <executable>" executa o executável no contexto do shell em execução. Se você definir variáveis no script, elas persistirão no shell do qual você as origina.

O comportamento normal quando você executa um programa ou script é instanciar um novo shell e iniciar o processo. (É por isso que os scripts começam com #!/bin/sh , #!/bin/perl -w , etc - que prescreve o shell e as opções a serem usadas)

"Sourcing", o script é útil para carregar variáveis de ambiente específicas de um aplicativo, geralmente um banco de dados ou ambiente de desenvolvimento. Se você executar várias instâncias de banco de dados Oracle ou outras, poderá ter um conjunto de scripts de "origem" ou "ambiente" para os ambientes de produção, desenvolvimento e controle de qualidade. Se você tem um farm de compilação que tem como alvo múltiplas plataformas (ou seja, produzindo binários do Solaris a partir de um farm Linux), você pode ter esses scripts para carregar facilmente as variáveis de ambiente adequadas.

    
por 05.07.2009 / 15:47
0

. nome do arquivo

Executa o arquivo de script no contexto atual. Usado principalmente para exportar variáveis do shell script para o shell em execução atual. Então, se exportar alguma nova variável no arquivo "~ / .bash_profile" e queremos aplicar as mudanças no shell atual sem fazer logoff, podemos usar o comando

. ~/.bash_profile

para executar "~ / .bash_profile" novamente no contexto atual e obter as novas variáveis exportadas.

nome do arquivo

Se o comando estiver presente no caminho de pesquisa, ele será executado. Arquivo nomeado comando na pasta atual não será executado, se a pasta atual não estiver incluída no caminho de pesquisa. Para ver o caminho atual use

echo $PATH

Se o executável chamado "filename" estiver presente em mais de uma pasta no caminho. O executável na primeira pasta listada no caminho será executado. Para ver onde está o arquivo que está sendo executado ao digitar "filename" use

which filename

C. ./filename

É usado para executar nome do arquivo executável nomeado no atual diretório de trabalho.

    
por 05.07.2009 / 18:35

Tags