Команда source в Linux — как выполнять скрипты и изменять среду Bash

Source — это встроенная команда оболочки, которая принимает файл в качестве аргумента, читает его содержимое и выполняет содержащиеся в нём команды в текущем процессе оболочки. На многих системах её синонимом является точечная нотация: . <путькфайлу>. Это отличие от запуска скрипта как отдельного процесса (например, через bash ./скрипт), где изменения среды происходят в дочернем процессе и не влияют на родителя.
Когда использовать source
- Загрузить переменные окружения в текущую сессию (например, API-ключи, PATH).
- Подключить функции или алиасы, определённые в файле, чтобы использовать их сразу.
- Подготовить окружение перед сборкой или запуском (например, load-project-env).
Выполнение команд из файла с помощью source
Ниже шаги и примерный рабочий процесс для теста:
# Создаём файл и открываем его в редакторе
touch test.txt
vi test.txt
# Внутри test.txt пишем команды:
echo "Hello!"
pwd
ls
# Сохраняем и выполняем:
. test.txt # точка — альтернатива source
source test.txtВ результате команды внутри файла выполнены в текущей оболочке и их вывод появляется в том же терминале.

Совет: если команда test.txt не исполняется как программа (без shebang и права +x), использование source или . — самый простой способ выполнить её содержимое без изменений прав.
Изменение среды Bash с помощью source
Важно понимать поведение переменных окружения при порождении процессов.
Пример, демонстрирующий разницу между обычным запуском скрипта и его source:
export TEST="deb"
vi example
# В файле example:
export TEST="bed"
echo $TEST
# Отдельный запуск
chmod +x example
./example # выведет "bed" в дочернем процессе
echo $TEST # выведет "deb" в родительской оболочке
# Запуск через source
. example # или source example
echo $TEST # теперь выведет "bed" — переменная обновлена в текущей оболочкеВывод: если нужно, чтобы изменения переменных, функций или алиасов остались в текущей сессии, используйте source.

Разница между bash и source
- bash ./скрипт — запускает новый процесс Bash. Изменения среды остаются в дочернем процессе.
- source ./скрипт — интерпретирует команды внутри текущей оболочки. Изменения сохраняются в текущей сессии.
Практическая подсказка: используйте bash для изолированного выполнения и source для внесения изменений в текущую среду.
Частые ошибки и устранение неисправностей
Ошибка “source not found” или команда не распознаётся.
- Причина: вы используете оболочку, в которой нет встроенной команды source (например, dash в POSIX-режиме).
- Решение 1: используйте точечную нотацию . file (работает в большинстве POSIX-совместимых оболочек).
- Решение 2: смените оболочку командой chsh -s $(which bash) и откройте новый терминал.
Файл не выполняет эффекта на родительскую оболочку.
- Проверьте, что вы действительно используете source или . — если выполняете ./файл, изменения будут локальны для дочернего процесса.
- Убедитесь, что в файле нет команды exit, которая закроет текущую оболочку при source.
Права доступа и shebang.
- При source права +x и shebang не требуются: файл читается как набор команд.
Альтернативные подходы
- export VAR=value напрямую в интерактивной сессии, если это разовое изменение.
- Использовать env-file и команду direnv для переключения окружений проекта автоматически.
- Выполнить скрипт в отдельном процессе и передавать результаты через stdout/stdin или временные файлы, если нужно изолировать изменения.
- Для автоматизации CI/CD лучше явно экспонировать переменные в контексте конвейера, а не source конфигурации локальной оболочки.
Ментальная модель (как думать о source)
Представьте оболочку как комнату. Запуск ./скрипт — это приглашение гостя в новую комнату (дочерний процесс): он может сделать всё внутри, но его изменения не затронут вашу комнату. Source — это приглашение того же гостя работать прямо у вас: он переставляет мебель (переменные/функции) в вашей комнате.
Мини‑методология: безопасное тестирование скриптов при source
- Проверяйте скрипт на предмет
exitиcd— они повлияют на вашу сессию. - Тестируйте сначала в новой вкладке терминала: source file; если что-то пошло не так — закройте вкладку.
- Используйте set -u и set -e локально в скрипте для ловли ошибок, но помните, что set -e в sourced-файле может завершить вашу оболочку.
- Для безопасных изменений импортируйте в функцию: source файл, который определяет функцию; затем вызывайте функцию вручную.
Роль‑ориентированный чеклист
Разработчик:
- [ ] Файл с настройками не содержит
exit. - Переменные документированы и не конфликтуют с системными.
- Используется .env.example для шаблона.
- [ ] Файл с настройками не содержит
Системный администратор:
- Проверена совместимость с /bin/sh или /bin/bash.
- Прописаны права доступа и владельцы для файлов с секретами.
- Применён direnv или аналог для изоляции окружений.
CI инженер:
- Переменные окружения заданы в интерфейсе CI, а не source локальных файлов.
- Если нужен source, то файл берётся из защищённого хранилища.
Сниппеты и шаблоны (cheat sheet)
Пример: файл env-setup.sh
# env-setup.sh
# Не ставьте тут exit или set -e без осознания последствий
export PROJECT_HOME="$HOME/projects/myapp"
export PATH="$PROJECT_HOME/bin:$PATH"
alias gs='git status'
# Функция, которую удобно держать в текущей оболочке
mkcd() { mkdir -p "$1" && cd "$1"; }Загрузка:
# Загрузить в текущую сессию
source env-setup.sh
# или
. env-setup.shКороткий шаблон для безопасного source (защита от повторного исполнения):
# в файле config.sh
if [ -z "${_MYAPP_CONFIG_INCLUDED-}" ]; then
_MYAPP_CONFIG_INCLUDED=1
export VAR=...
fiКогда source не подходит (контрпримеры)
- Вы хотите изолировать выполнение и предотвратить влияние на текущую сессию (тогда запускайте через bash ./script).
- Скрипт приходит из ненадёжного источника: лучше запускать в контейнере или sandboxes.
- Нужна повторяемость в CI: храните переменные в настройках CI, а не source локальных файлов разработчика.
Критерии приёмки
- Скрипт, который предполагается засовершиться через source, при загрузке создаёт ожидаемые переменные и функции.
- Выполнение source не завершает сессию случайным exit.
- Изменения видны в родительской оболочке после source.
Безопасность и конфиденциальность
- Не храните секреты в файлах, доступных другим пользователям; лучше использовать менеджеры секретов.
- Проверяйте права доступа (chmod 600) для файлов с приватными ключами или секретными токенами.
Дополнительные ресурсы и подходы для миграции
- direnv — автоматическая загрузка окружения при переходе в директорию проекта.
- systemd –user environment: для сервисов и фоновых задач лучше передавать переменные через systemd unit.
Короткий глоссарий
- source: встроенная команда оболочки для выполнения содержимого файла в текущем процессе.
- точечная нотация (.): синоним source в большинстве оболочек.
- дочерний процесс: отдельный процесс, порождённый текущей оболочкой; его изменения окружения не поднимаются к родителю.
Краткое резюме
Source — простой и мощный способ изменить текущую оболочку: он полезен для загрузки переменных, алиасов и функций без форка. Используйте точку для совместимости, проверяйте содержимое файлов перед подключением и применяйте практики безопасности для конфиденциальных данных.
Важно: перед массовым использованием source в производственной среде согласуйте процессы с командой безопасности и автоматизируйте проверку содержания подключаемых файлов.
Похожие материалы
Настроить меню правого клика в Windows
Группировать окна по приложениям в Mission Control
Google Docs для писателя: писать и форматировать книгу
Как создать уютный рабочий стол
Как скрыть синюю галочку в X (Twitter)