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