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