Por que 'source' e '.' nem sempre é o mesmo, quando deveriam ser idênticos?

3

Fiquei com a impressão de que source era sinônimo de . no bash. No entanto, parece que no arquivo .profile , source não funciona. Este vídeo do youtube demonstra que quando source é usado em ~/.profile para originar um arquivo foo , o variável definida nesse arquivo não é exportada para shells subseqüentes. No entanto, se, em vez disso, o arquivo for originado usando . , a variável será exportada conforme o esperado.

Observe que quando eu uso source , a variável de ambiente NÃO é exportada, mas quando eu uso . , ela é exportada.

    
por dmd 19.03.2014 / 18:44

1 resposta

8

Eles são exatamente iguais, conforme explicado em man 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 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 argu‐ ments 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.

O problema aqui é que source é uma coisa bash , o padrão é, na verdade, . . Seu .profile é lido apenas por shell de login e por alguns (não todos) gerenciadores de login. No entanto, os gerenciadores de login (como o lightdm) tentarão ler (fonte) o arquivo usando o shell padrão do sistema, normalmente /bin/sh . Em sistemas derivados do Debian, /bin/sh é um link simbólico para /bin/dash e dash é um shell muito simples, compatível com POSIX que não é bash e não tem conhecimento do source palavra-chave.

Portanto, o comando é ignorado, o arquivo não é originado e a variável não é definida. Para ilustrar:

$ cat foo
myvar='foo1'
$ source foo
$ echo $myvar
foo1

A mesma coisa em dash :

$ echo $0
dash
$ source foo
dash: 11: source: not found
$ . ~/foo  ## dash needs the full path
$ echo $myvar
foo1
    
por terdon 19.03.2014 / 19:08