Tudo bem usar "." executar arquivos em vez de fonte - em .bashrc no Ubuntu e OS X?

11

OK, sourceexecuta o script no shell atual e .separadamente, conforme detalhado na execução de scripts com "." E "source", por exemplo, mas, especificamente, no meu .bashrcarquivo, 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 - é esse o problema do "POSIX"?

Eu tentei e os itens acima ainda parecem funcionar no Ubuntu (então eles realmente funcionam com os dois sourcee ., 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 procuro o meu .bashrcno meu .bash_profile.

Michael Durrant
fonte
1
Se for conchas baseadas em 'sh', eu estaria usando '.' para compatibilidade global e se você estiver usando shells baseados em 'csh', eu estaria usando o source.
Mdpc
2
Em que parte do post vinculado você vê que " sourceexecuta o script no shell atual e .separadamente"? Ambos o executam no shell atual; caso contrário, não haveria sentido
Michael Mrozek

Respostas:

11

Esta é a definição do POSIX de .dot:

O shell deve executar comandos do arquivo no ambiente atual.

Se o arquivo não contiver a /<slash>, o shell usará o caminho de pesquisa especificado por $PATHpara encontrar o diretório que contém o arquivo. Ao contrário da pesquisa normal de comando, no entanto, o arquivo pesquisado pelo .dot utilitário não precisa ser executável. Se nenhum arquivo legível for encontrado, um shell não interativo deve abortar; um shell interativo deve escrever uma mensagem de diagnóstico para erro padrão, mas essa condição não deve ser considerada um erro de sintaxe.

Considerando o exposto, você também pode substituir o seu [ -f ./file ] && source ./filepor . ./filecompleto. Se o arquivo não estiver lá, o pior que acontecerá é que você receberá um aviso no login - o que provavelmente é a informação que você gostaria de ter, eu acho.

Obviamente, se você preferir manter o teste, poderá:

test -f ./file && . $_
mikeserv
fonte
2
Ah, gente sabendo $_, eu gosto disso. :)
Andreas Wiese
@AndreasWiese - todos deveriam - é um dos apenas 7 parâmetros especiais definidos pelo POSIX.
mikeserv
+1 Acabei usando a test -f /.file && . $_abordagem mostrada aqui #
Michael Durrant
6
@mikeserv Não, $_não é padronizado pelo POSIX. Os 8 parâmetros especiais são $@, $*, $#, $$, $!, $?, $-e $0. $_é explicitamente omitido . Seu comentário incorreto provocou uma pergunta .
Gilles 'SO- stop be evil'
19

Em bash, .e sourcesão sinônimos. Examinando o bashcódigo-fonte, o arquivo builtin/source.def, você pode ver .e sourceusar 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 sourcenão é compatível com POSIX, portanto, se seu script for chamado com POSIX /bin/sh, você deve usar em .vez de source. Como o POSIX não restringe o shell, todo o script acima funcionará.

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

cuonglm
fonte
Todas as coisas são iguais, use "fonte" em vez de "." por um motivo: tente pesquisar / grep por "." expressões em um script grande. É um pesadelo.
abonet 16/05
Embora essa resposta explique por que o uso .geralmente é "melhor" do que o uso source, como diz o @abonet, sourceé muito mais fácil procurar. Como os períodos são pontuados em vários idiomas, é fácil para os olhos pularem sobre eles. É por isso que eu prefiro usar source.
214 Joe