A sintaxe . executable
não funciona com qualquer executável (ou é?). Em vez disso, é um alias para o bash source
integrado. Então a diferença é mais relevante para os scripts bash, e a verdade é que eles 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 em seu $PATH
(o que seria feito se você não especificasse um caminho com o comando). A razão pela qual você não pode apenas fazer executable
é de segurança; imagine que você descompacte um arquivo baixado e contenha uma versão mal-intencionada de ls
. Se ele fosse executado diretamente de seu diretório atual, você executaria essa versão sem perceber.
Por outro lado, . executable
está dizendo "fonte de um arquivo chamado executable
". Como você está nomeando diretamente o arquivo e ele realmente não precisa ser um executável, a restrição de segurança para o $ PATH não se aplica. O sourcing apenas "executa" (ou parece executar) scripts de shell. O que isso 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 é a diferença entre executar e terceirizar? Assumindo o mesmo script de shell, executá-lo ( ./script
) gerará um novo shell, executará o script dentro desse shell e, quando o script sair, fechará esse shell e retornará ao shell pai. Com efeito, ele iniciará um novo processo bash
para executar o script).
( . script
) fará com que o shell atual leia os comandos do arquivo como se eles estivessem sendo digitados na linha de comando. Não há nova shell gerada.
Uma maneira muito fácil de ver como isso se comporta é escrever um script que contenha apenas exit
. Se você ./script
, nada parecerá acontecer, isso é porque um novo processo de shell é iniciado, o comando exit
sai desse novo shell e seu shell atual não é afetado.
Se você . script
, seu terminal atual será fechado, porque o comando exit
é executado no shell atual. Então, é equivalente a digitar exit
no prompt de comando.