./bla.sh
Aqui, o comando é ./bla.sh . Isso faz com que o shell procure por um executável chamado bla.sh no diretório atual e, em seguida, peça ao kernel para executá-lo como um programa normal, em um processo separado do shell. (Não importa se bla.sh é um script bash , um perl ou python one ou um binário compilado.)
. bla.sh
Aqui, o comando é . (também conhecido como source ), um comando interno do seu shell. Faz o shell procurar por um arquivo chamado bla.sh no caminho do sistema ($ PATH) e interpretar o conteúdo como se ele fosse digitado por você; Tudo isso é feito no mesmo processo como o próprio shell (e, portanto, pode afetar o estado interno do shell).
Isso, é claro, só funciona quando bla.sh contém comandos para o bash shell (se esse é o que você está usando atualmente), não funcionará para perl scripts ou qualquer outra coisa.
(Isso é explicado em help . e help source também.)
Como . e ./ são coisas completamente diferentes (um comando versus parte de um caminho), eles podem ser combinados, é claro - usar . ./bla.sh iria "originar" um arquivo bla.sh no diretório atual .
Normalmente, é melhor usar o método ./bla.sh . Somente ~/.bashrc , ~/.profile e tais arquivos são geralmente originados, porque eles devem modificar o ambiente atual.