Quando você executa ./s
, você diz ao kernel para executar o programa s
. Se você tem permissão de execução, o kernel lê os primeiros bytes do arquivo, vê a linha #!
para saber que é um script e executa o interpretador, passando o nome do script como primeiro argumento. Se você não tem permissão de execução, o kernel aborta a execução na primeira etapa.
Quando você executar zsh s
, você executará zsh
e instruirá para ler o arquivo chamado s
e interpretá-lo como comandos. Você não está executando s
, está executando zsh
. Mesma coisa com sh s
ou cat s
.
Quando você executa source s
, novamente, você diz ao zsh para ler um arquivo, então o que importa é que você tenha permissão de leitura nele.