Eu precisaria de alguns esclarecimentos sobre a maneira como executamos os executáveis no terminal. Essa pode ser uma pergunta esfarrapada, mas qual é a diferença entre executar um executável com ./an_executable
e . an_executable
(vamos supor que estamos no diretório em que um an_executable está localizado)
Eu já sei que o primeiro faz com que o shell procure por um_executável no diretório atual ( .
), mas por que não é /
necessário depois de .
usar a última versão?
Desde já, obrigado.
command-line
executable
zipzap
fonte
fonte
Respostas:
A
. executable
sintaxe não funciona com nenhum executável (ou funciona?). Em vez disso, é um alias para o bashsource
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 issoexecutable
é de segurança; imagine que você descompacta um arquivo baixado e ele contém uma versão maliciosals
. 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 chamadoexecutable
". 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 é: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 novobash
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, oexit
comando sai desse novo shell e seu shell atual não é afetado.Se você
. script
, seu terminal atual será fechado, porque oexit
comando é executado no shell atual. Portanto, é equivalente a digitarexit
no prompt de comando.fonte
ls
saída: você digita o comando, ele executa, mostra a saída e depois termina, mas a saída permanece no terminal.bash
shell executando dentro dele. Se você digitarbash
, estará executando outro shell; para o primeiro shell, é apenas um programa a ser executado. Se você digitarexit
, fechará o último shell iniciado, mas ainda estará no primeiro (o de quando você iniciou o terminal). Novamente, tudo isso acontece dentro do mesmo terminal.