./ vs. para executar programas no terminal

13

Eu precisaria de alguns esclarecimentos sobre a maneira como executamos executáveis sob o terminal. Essa pode ser uma pergunta ruim, mas qual é a diferença entre executar um executável com ./an_executable e . an_executable (suponha que estejamos na pasta em que um_executável está localizado)

Eu já sei que o primeiro faz o shell procurar um_executável no diretório atual ( . ), mas por que não é necessário / após . ao usar a última versão?

Obrigado antecipadamente.

    
por zipzap 12.02.2015 / 16:40

1 resposta

22

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.

    
por roadmr 12.02.2015 / 16:55