source script.sh
запускает сценарий в текущем процессе, поэтому все назначения переменных сохраняются как переменные даже после завершения сценария (и не обязательно должны быть явно export
'd).
./script.sh
просто запускает сценарий в подпроцессе, и любые переменные, которые назначены, исчезают после выполнения сценария.