OK, source
execute o script no shell atual e .
separadamente, conforme detalhado emexecutando script com ". " e com "source"por exemplo, mas, especificamente, na minha.bashrc
arquivo, 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 source
e .
, 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 .bashrc
arquivo .bash_profile
.
Responder1
Em bash
, .
e source
são sinônimos. Olhando para bash
o código-fonte, file 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, 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$PATH
para 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 ./file
por . ./file
completamente. 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 && . $_