2009-09-24 10:35:48 +0000 2009-09-24 10:35:48 +0000
604
604

O que faz a "fonte"?

$ 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. Porque não existe qualquer documentação sobre ela em Ubuntu? O que é que ele faz? Como posso instalar documentação sobre o Ubuntu?

Respostas (9)

289
289
289
2013-07-11 13:24:07 +0000

Tenha cuidado! ./ e source são não são bem iguais.

  • ./script executa o script como um arquivo executável, lançando uma nova shell para executá-lo
  • source script lê e executa comandos a partir do nome do arquivo no ambiente current shell

Nota: ./script não é . script, mas . script == source script https://askubuntu.com/questions/182012/is-there-a-difference-between-and-source-in-bash-after-all?lq=1

92
92
92
2013-01-09 15:45:47 +0000

É útil conhecer o comando ‘tipo’:

> type source
source is a shell builtin

sempre que algo é uma concha construída é hora de fazer man bash.

40
40
40
2009-09-24 10:48:52 +0000

. (a period) é um comando bash shell integrado que executa os comandos de um ficheiro passado como argumento, na shell actual. source" é um sinónimo de “.”.

Da página de 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.
32
32
32
2009-09-24 10:46:01 +0000

A “fonte” é a versão longa do comando “.”. Na prompt bash pode-se fazer:

source ~/.bashrc

para recarregar a sua configuração bash (alterada?) para bash corrente.

Versão curta seria:

. ~/.bashrc

A página man:

. 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.
28
28
28
2015-03-27 13:57:39 +0000

source executa o script fornecido (a permissão de execução é não é obrigatória* ) no ambiente current* shell, enquanto ./ executa o script fornecido executable* numa novo shell. O comando

source tem um sinónimo . filename.

Para que fique mais claro, veja o seguinte script, que define o alias.

make_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 a shell actual pode ser criado entre estas duas opções.

Opção 1: ./make_alias

Tornar o script executável primeiro.

chmod +x make_alias

Executar

./make_alias

Verificar

alias

Saída

**nothing**

002 ### ** O pseudónimo desapareceu com a nova shell.

Opção 2: source make_alias

Executar

source make_alias

ou

. make_alias

Verificar

alias

Saída

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

Sim O pseudónimo está definido.

10
10
10
2015-11-11 05:44:49 +0000

Em caso de dúvida, o melhor a fazer é usar o comando info :

[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.
5
5
5
2015-09-19 14:14:57 +0000

Digite o comando “help source” no seu shell.

Você terá 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
4
4
2017-06-12 00:13:34 +0000

Do Linux Documentation Project, Advanced Bash Scripting Guide, Capítulo 15 - Comandos Internos e Builtins :

source , . (comando dot): Este comando, quando invocado a partir da linha de comando, executa um script. Dentro de um script, um nome de ficheiro-fonte carrega o nome do ficheiro-fonte. Sourcing a file (dot-command) importa o código para o script, anexando-o ao script (mesmo efeito que a directiva #include num programa C). O resultado líquido é o mesmo que se as linhas de código “sourced” estivessem fisicamente presentes no corpo do script. Isto é útil em situações em que vários scripts usam um arquivo de dados comum ou biblioteca de funções. Se o arquivo sourced é em si mesmo um script executável, então ele será executado e então retornará o controle para o script que o chamou. Um script executável de origem pode usar um retorno para este fim.

Portanto, para aqueles familiarizados com a linguagem de programação C, a origem de um ficheiro tem um efeito semelhante ao da directiva #include.

Note também que pode passar argumentos posicionais para o ficheiro de origem, como:

$ source $filename $arg1 arg2
0
0
0
2018-11-28 08:58:53 +0000

Com a fonte pode passar variáveis ou funções de outro ficheiro para o seu script e utilizá-las sem ter de as escrever novamente.

F.I:

#!/bin/bash

source /etc/environment

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

Cheers