A . executable
sintaxe não funciona com nenhum executável (ou funciona?). Em vez disso, é um alias para o bash source
embutido. Portanto, a diferença é principalmente relevante para os scripts do bash, e a verdade é que são coisas completamente diferentes :)
./executable
pede para executar o executável "normalmente". ./
é uma referência relativa ao caminho atual. Isso evita que o shell (bash) tente localizar o executável em um diretório $PATH
(o que faria se você não especificasse um caminho com o comando). A razão pela qual você não pode simplesmente fazer isso executable
é de segurança; imagine que você descompacta um arquivo baixado e ele contém uma versão maliciosa ls
. Se ele fosse executado diretamente do seu diretório atual, você executaria essa versão sem perceber.
Por outro lado, . executable
está dizendo "origine um arquivo chamado executable
". Como você está nomeando o arquivo diretamente e ele realmente não precisa ser um executável, a restrição de segurança do $ PATH não se aplica. O fornecimento apenas "executará" (ou parecerá executar) scripts de shell. O que ele faz é:
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe‐
cuted from filename.
Então ... Qual é realmente a diferença entre executar e terceirizar? Supondo que o mesmo script de shell, executá-lo ( ./script
) gerará um novo shell, execute o script dentro desse shell e, quando o script sair, feche esse shell e retorne ao shell pai. Com efeito, ele iniciará um novo bash
processo para executar o script).
( . script
) fará com que o shell atual leia os comandos do arquivo como se estivessem sendo digitados na linha de comando. Não há nova concha gerada.
Uma maneira muito fácil de ver como isso se comporta é escrever um script que contenha apenas exit
. Se você ./script
, nada parece acontecer, isso ocorre porque um novo processo de shell é iniciado, o exit
comando sai desse novo shell e seu shell atual não é afetado.
Se você . script
, seu terminal atual será fechado, porque o exit
comando é executado no shell atual. Portanto, é equivalente a digitar exit
no prompt de comando.