Коли ви запускаєте сценарій оболонки, це робиться у допоміжній оболонці, тому він не може впливати на оточення батьківської оболонки. Ви хочете отримати джерело сценарію, виконавши:
. ./setfoo.sh
Це виконує його в контексті поточної оболонки, а не як допоміжний файл оболонку.
Зі сторінки керівництва bash:
. ім'я файлу [аргументи]
джерело ім'я файлу [аргументи]
Читання та виконання команд з імені файлу в поточному середовищі оболонки та повернення статусу виходу останньої команди, виконаної з імені файлу.
Якщо ім'я файлу не містить скісної риски, імена файлів у PATH використовуються для пошуку каталогу, що містить ім'я файлу.
Файл, який шукають у PATH, не обов'язково повинен бути виконуваним. Коли bash не в режимі POSIX, здійснюється пошук поточного каталогу, якщо в PATH не знайдено жодного файлу.
Якщо опцію sourcepath для вбудованої команди shopt вимкнено, PATH не буде здійснено пошук.
Якщо надаються будь-які аргументи, вони стають позиційними параметрами при виконанні імені файлу.
В іншому випадку позиційні параметри не змінюються. Статус повернення - це стан останньої команди, яка вийшла в сценарії (0, якщо жодна команда не виконується), і значення false, якщо ім'я файлу не знайдено або його неможливо прочитати.