Qual é a diferença entre '.' e 'fonte' em conchas? [duplicado]

7

Eu usei o comando ponto '.' e 'source' para recarregar um determinado arquivo rc (normalmente para atualizar minhas variáveis de ambiente), mas não tenho certeza se eles são diferentes e se um é o preferido. Qual é a diferença entre os dois?

    
por Ivar 14.12.2012 / 18:52

2 respostas

19

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

    
por 14.12.2012 / 19:45
2

source está lá para legibilidade e auto-documentação, . existe porque é rápido para digitar. Os comandos são idênticos. O Perl tem versões longas e curtas de muitas de suas variáveis de controle pelo mesmo motivo.

    
por 14.12.2012 / 19:13