Qual é o significado de um ponto antes de um comando no shell?

76

Ao seguir o tutorial de depuração do eclipse do android, encontro os seguintes comandos.

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator

Meu problema é o que o ponto anterior build/envsetup.shsignifica?

Jichao
fonte

Respostas:

80

Um ponto nesse contexto significa "originar" o conteúdo desse arquivo no shell atual. Com sourcesi ser um comando shell builtin. E sourceo operador de ponto sendo sinônimos.

Exemplo

Digamos que eu tenha o seguinte conteúdo em um sample.sharquivo.

$ cat sample.sh 
echo "hi"
echo "bye?"

Agora, quando eu fonte:

$ . sample.sh 
hi
bye?
$

Arquivos como esse costumam ser usados ​​para incorporar comandos de instalação, como adicionar itens às variáveis ​​de ambiente.

Exemplos

Digamos que eu tenha esses comandos em outro arquivo addvars.sh,.

$ cat addvars.sh 
export VAR1="some var1 string"
export VAR2="some var2 string"

Observe que eu não tenho nenhuma variável no ambiente do meu shell atual.

$ env | grep VAR
$

Agora, quando eu fonte este arquivo:

$ . addvars.sh 
$

OK, parece que não fez nada, mas quando verificamos as envvariáveis ​​novamente:

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
slm
fonte
72

Para adicionar à resposta do slm:

Existem duas maneiras de executar um script de shell. Uma é executar o script em um processo separado, o que significa que qualquer coisa sobre o ambiente do shell (estado da memória) reverterá para o estado do shell "pai" antes de executar o processo do shell "filho".

Por exemplo, o diretório de trabalho atual (o local no sistema de arquivos em que se encontra) é determinado por processo. Então, vamos ter um script parecido com este:

#!/bin/bash
cd ~
cd ..
pwd

Então, vamos chamar esse script, oh foo,. E vamos executar este script da seguinte maneira:./foo

Veremos o seguinte:

/home

(Exclusão de responsabilidade padrão de que há um grande número de distribuições de clones do Linux e do UNIX disponíveis no mercado, algumas das quais não colocam os diretórios do usuário /home. Ou, como costumávamos dizer "Sua milhagem pode variar")

Agora, depois de executar este script, vamos digitar este comando

pwd

Para ver em que diretório estamos. Vamos ver algo assim:

/home/username

O motivo é que, novamente, o script de shell que executamos tinha seu próprio ambiente (incluindo seu próprio diretório onde os comandos estavam sendo executados), e esse ambiente desapareceu assim que o script terminou de ser executado.

Agora, vamos executar o fooscript assim

. ./foo

Ou equivalente:

source ./foo

Se fizermos um pwddepois, veremos o seguinte:

/home

O motivo é que: fornecer um script não chama um processo separado. É como digitar todos os comandos no processo pai manualmente; seu ambiente é preservado após o término do script.


Deixe-me apresentar um exemplo mais simples. Vamos ter um script parecido com este:

#!/bin/bash
exit

Vamos nomear foo. Vamos ter certeza de que pode executá-lo: chmod 755 foo. Então, vamos rodar assim:

./foo

Nada acontece. No entanto, por outro lado, se fizermos isso:

. ./foo

Ou isto:

source ./foo

Nós terminamos a sessão.

samiam
fonte
6
Sua resposta é melhor que a aceita, entendi como você explicou, obrigado!
Ahmed
Dun-da-da-duuuun! (drumroll, por favor) ... e a frase mais importante aqui é !: A razão é: fornecer um script não chama um processo separado. É como digitar todos os comandos no processo pai manualmente; seu ambiente é preservado após o término do script.
Gabriel Staples
Você deve liderar com o segundo exemplo. Embala mais soco.
MonoThreaded
5

O ponto (ponto) é uma mão curta para o bash incorporado source. Ele lerá e executará comandos de um arquivo no ambiente atual e retornará o status de saída do último comando executado. Os arquivos podem estar no diretório atual ou em qualquer lugar do PATH. Não precisa ser executável.

tlund
fonte
1

Como descobrir.

# type .
. is a shell builtin

# help .
.: . filename [arguments]
    Execute commands from a file in the current shell.

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.

    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.
ctrl-alt-delor
fonte
Acho que falta uma vírgula no manual. Deveria dizer "Executar comandos de um arquivo, no shell atual".
ctrl-alt-delor
1

. (operador de origem ou ponto)
Leia e execute comandos a partir do argumento filename no contexto atual do shell.

Syntax
      . filename [arguments]

      source filename [arguments]

source é sinônimo de ponto / período '.' no bash, mas não no POSIX sh, portanto, para obter a máxima compatibilidade, use o período.

Quando um script é executado usando a origem, ele é executado no shell existente, todas as variáveis ​​criadas ou modificadas pelo script permanecerão disponíveis após a conclusão do script. Por outro lado, se o script for executado exatamente como o nome do arquivo, um subshell separado (com um conjunto de variáveis ​​completamente separado) será gerado para executar o script.

Há uma diferença sutil entre executar um script executando .ss64script (ponto ss64script) e. ss64script (espaço em ponto ss64script)

a primeira está executando um arquivo que foi oculto no comando 'ls' (embora ls -a mostre arquivos ocultos) a segunda opção executa o ss64script, mesmo que não tenha sido definido como executável no chmod.

Fonte

Premraj
fonte
0

TL; DR

O ponto é o mesmo que o comando de origem.

source é um comando Unix que avalia o arquivo após o comando, como uma lista de comandos, executada no contexto atual.

Extraído de https://en.wikipedia.org/wiki/Source_(command)

mochomecha
fonte
2
Bem-vindo ao U&L! Essa resposta duplica as informações que já estão na resposta aceita e realmente não adiciona nada.
JigglyNaga