Когда вы запускаете сценарий оболочки, он выполняется во вспомогательной оболочке, поэтому он не может повлиять на среду родительской оболочки. Вы хотите создать скрипт, выполнив:
. ./setfoo.sh
Это выполняет его в контексте текущей оболочки, а не как вспомогательную оболочку.
На странице руководства bash:
. имя файла [аргументы]
имя файла источника [аргументы]
Прочитать и выполнить команды из имени файла в текущей среде оболочки и вернуть статус выхода последней команды, выполненной из файла.
Если имя файла не содержит косой черты, имена файлов в PATH используются для поиска каталога, содержащего имя файла.
Файл, который ищется в PATH, не обязательно должен быть исполняемым. Когда bash не находится в режиме POSIX, выполняется поиск в текущем каталоге, если в PATH не найден файл.
Если параметр sourcepath для встроенной команды shopt отключен, поиск по PATH не выполняется.
Если предоставлены какие-либо аргументы, они становятся позиционными параметрами при выполнении filename.
В противном случае позиционные параметры не изменяются. Статус возврата - это статус последней команды, выполненной в рамках сценария (0, если никакие команды не выполняются), и false, если имя файла не найдено или не может быть прочитано.