. é 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).