tl; dr: a diferença é o bit executável.
A resposta está no modelo de permissões do UNIX. Para ser sincero, esqueço o modelo de permissões do Windows, mas no UNIX (e, portanto, no GNU / Linux), há três principais bits de permissão que podem ser definidos em um arquivo: ler, gravar e executar. Esses bits podem ser definidos em qualquer coisa . Existem dois tipos principais de arquivos nos quais você deseja definir o bit executável:
- Binários
- Scripts
O primeiro tipo funciona exatamente como .exe
s no Windows. A única diferença é que a capacidade do arquivo a ser executado é determinada por um bit de permissão no sistema de arquivos, em vez da extensão do arquivo. Os binários ainda têm um formato, assim como .exe
s. No GNU / Linux, esse formato é chamado de ELF . O kernel do Linux possui uma lógica especial que informa como ler o formato dos binários ELF. Quando você executa um binário, é essa lógica que realmente executa o código.
A parte que está confundindo você é o segundo tipo de executável: scripts. Scripts são arquivos de texto regulares que podem ser executados por um intérprete, como python
ou bash
. Os scripts começam com algo chamado shebang , que se parece com isto: #!
. Quando um script é "executado", o kernel reconhece o shebang e executa qualquer binário especificado após ele, com o caminho do script que você está executando como argumento.
Por exemplo, digamos que eu tenha um script com o bit de executável definido, no caminho /home/alex/bin/test_script
. Este script tem o seguinte como a primeira linha:
#!/bin/bash
Quando você executa este script, o kernel reconhecerá o shebang no começo. Em seguida, ele carregará /bin/bash
e passará /home/alex/bin/test_script
como o primeiro argumento. Isso seria equivalente a executar o seguinte na linha de comando:
/bin/bash /home/alex/bin/test_script
Dessa forma, bash
é carregado para interpretar ou "executar" o script.
Como um pequeno aparte, a mudança de fonte para binário não é tão grande que não possa ser revertida. A recuperação do código-fonte de um binário é chamada decompiling .