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 .