.
é o comando shell Bourne e POSIX, enquanto source
é o comando C-Shell.
Alguns derivados Bourne-shell como bash
, zsh
e a maioria das implementações de ksh
também possuem um comando source
que geralmente é um alias para .
, embora para ksh com diferenças.
Para o bash e o zsh, .
e source
se comportam da mesma forma, mas seu comportamento é afetado pelo fato de eles serem executados no modo POSIX ou não¹.
POSIX requer que o comando .
saia do shell se não puder abrir o arquivo para leitura e exija que o arquivo seja encontrado por meio de uma pesquisa nos diretórios em $PATH
se o caminho fornecido não contiver um /
.
zsh e bash .
e source
se comportam como POSIX requer quando no modo POSIX, e como source
do pdksh quando não, ou seja, eles não saem do script se não conseguirem abrir o arquivo para leitura ( igual a command .
) e pesquisa o arquivo em $PATH
e o diretório atual se o caminho fornecido não contiver /
.
AT & T ksh source
não sai do shell, mas não procura pelo arquivo no diretório atual.
Em resumo, em shells semelhantes a Bourne (embora não seja o shell Bourne que não tem um command
construído), se você quiser um comportamento consistente, você poderia fazer
command . the-file-to-source || handle-error
E se arquivo-a-fonte estiver no diretório atual, não se esqueça de escrever:
command . ./the-file-to-source || handle-error
Em sh
scripts (onde sh
é um POSIX sh
) você deve poder confiar no comportamento POSIX indicado acima.
¹ zsh
e bash
ativam o modo POSIX quando chamado como sh
. Por bash
, também quando recebe POSIXLY_CORRECT
em seu ambiente (mesmo quando chamado como bash, embora não exista nenhum comando POSIX chamado bash
), ou quando ele recebe SHELLOPTS=posix
, ou quando chamado com bash --posix
ou bash -o posix
ou depois de um set -o posix
. Com o zsh, você usa emulate sh
para emular sh
. As emulações alteram um monte de opções que mudam o comportamento do zsh. Nesse caso, a opção é POSIX_BUILTINS
.
No bash, você pode verificar se no modo POSIX ou não com o comando (não-POSIX), [ -o posix ]
. Em zsh, você verifica a saída de emulate
para ver se está em sh
emulation ou [[ -o posixbuiltins ]]
para verificar se essa opção específica está ativada. Você também pode ativar temporariamente um determinado modo de emulação com emulate -L
(para emular apenas no escopo local atual).