Não há problema em usar o “.” para executar arquivos em vez do source-in .bashrc no Ubuntu e OS X?

11

OK, então source executa o script no shell atual e . separadamente, conforme detalhado em executando script com". "e com" source " por exemplo, mas, especificamente, no meu arquivo .bashrc , eu tenho:

[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && source ~/.autojump/etc/profile.d/autojump.sh

Posso substituir isso por:

[ -f ~/.bash_aliases ] && . ~/.bash_aliases
[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && . ~/.autojump/etc/profile.d/autojump.sh

Isso funcionará no OS X - é a questão "POSIX"?

Eu tentei e o acima ainda parece funcionar no Ubuntu (então eles realmente trabalham com source e . , isto é, eles me dão a funcionalidade desejada no shell). Devo escolher um sobre o outro, ou estou faltando alguma coisa?

FWIW, no OS X, eu obtenho meu .bashrc do meu .bash_profile .

    
por Michael Durrant 10.05.2014 / 22:17

2 respostas

11

Isso é a definição POSIX de .dot :

The shell shall execute commands from the file in the current environment.

If file does not contain a /<slash>, the shell shall use the search path specified by $PATH to find the directory containing file. Unlike normal command search, however, the file searched for by the .dot utility need not be executable. If no readable file is found, a non-interactive shell shall abort; an interactive shell shall write a diagnostic message to standard error, but this condition shall not be considered a syntax error.

Considerando o acima, é melhor substituir apenas [ -f ./file ] && source ./file por . ./file . Se o arquivo não está lá, o pior que vai acontecer é que você receberá um aviso no login - que é provavelmente a informação que você gostaria de ter, eu acho.

Claro, se você preferir manter o teste que você pode fazer:

test -f ./file && . $_
    
por 10.05.2014 / 22:50
19

Em bash , . e source são sinônimos. Analisando o código-fonte bash , arquivo builtin/source.def , você pode ver . e source usar a mesma função interna source_builtin :

$BUILTIN source
$FUNCTION source_builtin
$SHORT_DOC 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.
$END

$BUILTIN .
$DOCNAME dot
$FUNCTION source_builtin
$SHORT_DOC . filename [arguments]
Execute commands from a file in the current shell.

Mas source não é compatível com POSIX, portanto, se o script for chamado com POSIX /bin/sh , você deverá usar . em vez de source . Como o POSIX não restringe o shell, todo o seu script acima funcionará.

Pessoalmente, sempre uso . em vez de source . (Muitos scripts que escrevi são executados em cron ).

    
por 10.05.2014 / 22:40