O comando exec substitui a imagem do processo atual - o executável ou programa - por um novo, nomeado como argumento para exec. Se $ SHELL contiver o nome de um executável, como normalmente faz, exec irá girar o exe no lugar do shell em execução.
No entanto, essa é uma ação muito diferente do que apenas usar "source" para ler em um arquivo de comandos. O comando source lê o arquivo nomeado e executa o conteúdo linha por linha, como se digitado na linha de comando do shell atual.