Quando você executa ./hello.sh
, você diz ao kernel para executar o programa hello.sh
. Se você tem permissão de execução, então o kernel lê os primeiros bytes do arquivo, vê o #! line para que ele saiba que este é um script e executa o interpretador ( /bin/bash
), passando o nome do script como seu primeiro argumento. Então o bash trata o arquivo como uma série de instruções. Se você não tem permissão de execução, o kernel aborta a execução na primeira etapa.
Quando você executa . hello.sh
ou source hello.sh
, não está pedindo ao kernel para executar hello.sh
. Você está pedindo bash para ler o arquivo hello.sh
e interpretá-lo como uma série de instruções.
É a mesma coisa se você executar bash hello.sh
, a propósito: você não está executando hello.sh
, você está interpretando isso por bash (que está sendo executado). Veja Executando um script em permissões do arquivo zsh .