" source
funciona, mas por quê?" - Quando você executa um script que está definindo variáveis de ambiente, você inicia um subshell por padrão. As variáveis recém-definidas não necessariamente retornam ao seu shell de nível superior. Quando você source
um script, você está dizendo ao seu shell para executar os comandos no seu shell atual e não iniciar um subshell, assim as variáveis recém-configuradas estarão no shell que você espera que elas estejam dentro.