O que 'source' faz?


583
$ whatis source
source: nothing appropriate.
$ man source
No manual entry for source
$ source
bash: source: filename argument required
source: usage: source filename [arguments]

Existe e é executável. Por que não existe documentação sobre isso no Ubuntu? O que isso faz? Como posso instalar documentação sobre isso?



54
você esqueceu $ type source source is a shell built-in
bnjmn

2
Minha concha retornou isso $ whatis source source (1) - bash built-in commands, see bash(1). Além disso, man sourceme leva às BASH_BUILTINS(1)páginas de manual. Isso está no Fedora, não há idéia do por que esses pacotes debian não estão documentados (ou mal).
Arielnmz

4
@lesmana, ótimo link. Essa resposta vinculada é a resposta mais completa a essa pergunta.
Scott

5
Tente "fonte de ajuda"
Jasser

Respostas:


469

sourceé um comando interno do bash shell que executa o conteúdo do arquivo passado como argumento, no shell atual . Tem um sinônimo em .(ponto final).

Sintaxe

. filename [arguments]

source filename [arguments]

8
É sourceum comando específico do bash ou outros shells também o possuem? (Eu estou pedindo para obter tags no sobre a questão ...)
Jonik

2
Afaik, sourceestava presente na concha Bourne e, portanto, provavelmente presente em todos os seus descendentes. en.wikipedia.org/wiki/Bourne_shell . Eu sei que nem todas as conchas têm o sourcecomando, menos certo sobre quais conchas o contêm.
nagul

13
@ Nagul, sourcenão estava presente no shell Bourne, é uma extensão GNU que veio muito mais tarde. A sintaxe original e ainda portátil (POSIX) é usar o comando "ponto", ou seja .. Pessoalmente, nunca o utilizo, uma sourcevez que demora mais para digitar e não possui valor agregado. Eu acho que seu principal objetivo é tornar os scripts mais legíveis para iniciantes.
Jlliagre

18
@ jlliagre meu pessoal "explicar por que ter fonte" é que sourcenão é apenas mais descritivo, mas parece algo diferente de um erro de digitação. Já tive pessoas pulando o ponto / ponto quando envio comandos técnicos por email.
Ricos Homolka

3
Um uso comum para esse comando é um script de shell sourceem um "arquivo de configuração" que contém principalmente atribuições de variáveis. As atribuições de variáveis ​​controlam as coisas que o restante do script faz. Obviamente, um bom script definirá variáveis ​​para padrões sensíveis antes de source, ou pelo menos verificará valores válidos.
LawrenceC

276

Seja cuidadoso! ./e nãosource são exatamente iguais .

  • ./scriptexecuta o script como um arquivo executável, iniciando um novo shell para executá-lo
  • source scriptlê e executa comandos do nome do arquivo no ambiente atual do shell

Nota: ./scriptnão é . script, mas . script==source script

https://askubuntu.com/questions/182012/is-there-a-difference-between-and-source-in-bash-after-all?lq=1


27
Você está misturando ./command e. roteiro. comando-fonte é o mesmo que comando-. Usando ./meh, execute o script / binário chamado meh no diretório atual e não tenha nada a ver com o source /. -comando. Conforme explicado na resposta no seu link.
Joakim Elofsson

2
@JoakimElofsson Isso é mencionado no link, mas modificarei a resposta para evitar erros de compreensão. Por favor corrija isso.
damphat

3
É uma espécie de importante que a resposta aceita também aponta para um presente, porque, por um momento eu pensei que./ == source == .
Daniel F

90

É útil conhecer o comando 'type':

> type source
source is a shell builtin

sempre que algo está embutido, é hora de fazer man bash.


1
Sempre sabe algo novo ao ler man)

19
Você também pode usar help {builtin-name}, ie help source.
LawrenceC

1
helpnão funciona em qualquer lugar (pelo menos no zsh). typefaz.
kumarharsh

4
Para amplificar: se você estiver usando o bash, e se souber (talvez por 'tipo') que é um comando interno, 'help' o levará diretamente ao parágrafo da documentação desejada sem percorrer 4.184 linhas de ' homem bash 'texto.
precisa

38

. (um ponto) é um comando interno do shell bash que executa os comandos de um arquivo passado como argumento, no shell atual. 'source' é sinônimo de '.'.

Na página do manual do Bash:

. filename [arguments]
source filename [arguments]
       Read  and  execute  commands  from filename in the current shell
       environment and return the exit status of the last command  exe
       cuted from filename.  If filename does not contain a slash, file
       names in PATH are used to find the  directory  containing  file
       name.   The  file  searched  for in PATH need not be executable.
       When bash is  not  in  posix  mode,  the  current  directory  is
       searched  if no file is found in PATH.  If the sourcepath option
       to the shopt builtin command is turned  off,  the  PATH  is  not
       searched.   If any arguments are supplied, they become the posi
       tional parameters when  filename  is  executed.   Otherwise  the
       positional  parameters  are unchanged.  The return status is the
       status of the last command exited within the  script  (0  if  no
       commands  are  executed),  and false if filename is not found or
       cannot be read.

27

'source' é a versão longa de '.' comando. No prompt do bash, pode-se fazer:

source ~/.bashrc

para recarregar sua configuração (alterada?) do bash para o bash atual em execução.

A versão curta seria:

. ~/.bashrc

A página do manual:

. filename [arguments]
source filename [arguments]
    Read and execute commands from filename in the current shell environment and
    return the exit status of the last command executed from filename. If 
    filename does not contain a slash, file names in PATH are used to find the
    directory containing filename. The file searched for in PATH need not be
    executable. When bash is not in posix mode, the current directory is
    searched if no file is found in PATH. If the sourcepath option to the shopt
    builtin command is turned off, the PATH is not searched. If any arguments
    are supplied, they become the positional parameters when filename is
    executed. Otherwise the positional parameters are unchanged. The return 
    status is the status of the last command exited within the script (0 if no
    commands are executed), and false if filename is not found or cannot be
    read. 

Essa deve ser a resposta aceita.
Peter Mortensen

25

sourceO comando executa o script fornecido (a permissão executável não é obrigatória ) no ambiente atual do shell, enquanto ./executa o script executável fornecido em um novo shell.

sourcecomando tem um sinônimo . filename.

Para deixar mais claro, dê uma olhada no script a seguir, que define o alias.

criar alias

#! /bin/bash

alias myproject='cd ~/Documents/Projects/2015/NewProject'

Agora, temos duas opções para executar este script. Mas com apenas uma opção, o alias desejado para o shell atual pode ser criado entre essas duas opções.

Opção 1: ./make_alias

Torne o script executável primeiro.

chmod +x make_alias

Executar

./make_alias

Verificar

alias

Resultado

**nothing**

Ops! Alias ​​se foi com o novo shell.

Vamos com a segunda opção.

Opção 2: source make_alias

Executar

source make_alias

ou

. make_alias

Verificar

alias

Resultado

alias myproject='cd ~/Documents/Projects/2015/NewProject'

Sim, Alias ​​está definido.


10

Em caso de dúvida, a melhor coisa a fazer é usar o infocomando:

[root@abc ~]# info source

BASH BUILTIN COMMANDS
       Unless otherwise noted, each builtin command documented in this section
       as accepting options preceded by - accepts -- to signify the end of the
       options.   The  :, true, false, and test builtins do not accept options
       and do not treat -- specially.  The exit, logout, break, continue, let,
       and  shift builtins accept and process arguments beginning with - with-
       out requiring --.  Other builtins that accept  arguments  but  are  not
       specified  as accepting options interpret arguments beginning with - as
       invalid options and require -- to prevent this interpretation.
       : [arguments]
              No effect; the command does nothing beyond  expanding  arguments
              and  performing any specified redirections.  A zero exit code is
              returned.

        .  filename [arguments]
       source filename [arguments]
              Read and execute commands from filename  in  the  current  shell
              environment  and return the exit status of the last command exe-
              cuted from filename.  If filename does not contain a slash, file
              names  in  PATH  are used to find the directory containing file-
              name.  The file searched for in PATH  need  not  be  executable.
              When  bash  is  not  in  posix  mode,  the  current directory is
              searched if no file is found in PATH.  If the sourcepath  option
              to  the  shopt  builtin  command  is turned off, the PATH is not
              searched.  If any arguments are supplied, they become the  posi-
              tional  parameters  when  filename  is  executed.  Otherwise the
              positional parameters are unchanged.  The return status  is  the
              status  of  the  last  command exited within the script (0 if no
              commands are executed), and false if filename is  not  found  or
              cannot be read.

Você poderia fornecer mais do que apenas RTFM?
Peter Mortensen

5

Digite o comando "fonte de ajuda" no seu shell.

Você obterá uma saída como esta:

source: source 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.

4

No projeto de documentação do Linux, no Advanced Bash Scripting Guide,
capítulo 15 - Comandos internos e recursos internos :

fonte , . (comando de ponto):
esse comando, quando chamado a partir da linha de comando, executa um script. Dentro de um script, um nome de arquivo de origem carrega o arquivo nome de arquivo. O fornecimento de um arquivo (comando de ponto) importa código para o script, acrescentando-o (mesmo efeito que a diretiva #include em um programa em C). O resultado líquido é o mesmo que se as linhas de código "originárias" estivessem fisicamente presentes no corpo do script. Isso é útil em situações em que vários scripts usam um arquivo de dados ou uma biblioteca de funções comum.
Se o arquivo de origem for um script executável, ele será executado e retornará o controle ao script que o chamou. Um script executável de origem pode usar um retorno para essa finalidade.

Portanto, para aqueles familiarizados com a linguagem de programação C, o fornecimento de um arquivo tem um efeito semelhante à #includediretiva.

Observe também que você pode passar argumentos posicionais para o arquivo que está sendo originado, como:

$ source $filename $arg1 arg2

Como esta resposta difere das 9 respostas anteriores?
Stephen Rauch

2
Eu adiciono outra fonte de informação e informações adicionais não mencionadas anteriormente.
Alexandro de Oliveira

Eu não sabia que sourcepoderia levar argumentos ou usar return.
Joe

2

Deve-se notar que, apesar de ser um comando incrível, nem sourcenem a sua forma abreviada de .se fonte de mais de um arquivo, significado

source *.sh

ou

. script1.sh script2.sh

não vai funcionar.

Podemos voltar a usar forloops, mas ele executaria o executável várias vezes, criando vários comandos ou problemas.

Conclusão: sourcenão aceita vários arquivos como entrada. O argumento tem que ser um.

O que é uma merda IMHO.


0

Com o código-fonte, você pode passar variáveis ​​ou funções de outro arquivo para o seu script e usá-las sem precisar escrevê-las novamente.

FI:

#!/bin/bash

source /etc/environment

source /myscripts/jetty-common/config/jetty-functions.sh

Felicidades

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.