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

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

OK, sourceexecute o script no shell atual e .separadamente, conforme detalhado emexecutando script com ". " e com "source"por exemplo, mas, especificamente, na minha.bashrcarquivo, 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 - esse é o problema do "POSIX"?

Eu tentei e o acima ainda parece funcionar no Ubuntu (então eles realmente funcionam com ambos sourcee ., ou seja, eles me dão a funcionalidade desejada no shell). Devo escolher um em vez do outro ou estou faltando alguma coisa?

FWIW, no OS X, eu obtenho meu .bashrcarquivo .bash_profile.

Responder1

Em bash, .e sourcesão sinônimos. Olhando para basho código-fonte, file 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, então se o 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 que escrevi são executados cron).

Responder2

Isso éDefinição de POSIXde .dot:

O shell deve executar comandos do arquivo no ambiente atual.

Se o arquivo não contiver um /<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 de comando normal, no entanto, o arquivo pesquisado pelo .dot utilitário precisanãoser executável. Se nenhum arquivo legível for encontrado, um shell não interativo será abortado; um shell interativo deve escrever uma mensagem de diagnóstico para o erro padrão, mas esta condição não deve ser considerada um erro de sintaxe.

Considerando o que foi dito acima, você pode simplesmente substituir o seu [ -f ./file ] && source ./filepor . ./filecompletamente. Se o arquivo não estiver lá, o pior que pode acontecer é você receber um aviso no login - o que provavelmente é uma informação que você gostaria de ter, eu acho.

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

test -f ./file && . $_

informação relacionada