Окружение и кастомизация оболочки [105.1]

Рейтинг: 66.7% · 13 голосов
Полный курс LPIC-1 (экзамены 101-500 и 102-500): архитектура, загрузка, пакеты, команды и текст, ФС и права, шелл-скрипты, пользователи, сервисы, сеть, безопасность. Debian и RHEL.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Окружение и кастомизация оболочки [105.1]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-1 и как устроен путь администратора
  2. Железо, устройства и модули ядра [101.1]
  3. Загрузка системы: от BIOS до systemd [101.2]
  4. systemd, цели и уровни выполнения [101.3]
  5. План разметки диска и swap [102.1]
  6. Загрузчик GRUB 2 [102.2]
  7. Разделяемые библиотеки [102.3]
  8. Управление пакетами в Debian: dpkg и apt [102.4]
  9. Управление пакетами RPM, DNF и Zypper [102.5]
  10. Linux как гость виртуализации [102.6]
  11. Командная строка Bash [103.1]
  12. Обработка текста фильтрами [103.2]
  13. Базовое управление файлами [103.3]
  14. Потоки, конвейеры и перенаправление [103.4]
  15. Процессы: создание, мониторинг, сигналы [103.5]
  16. Приоритеты выполнения процессов [103.6]
  17. Регулярные выражения [103.7]
  18. Редактор vi и vim [103.8]
  19. Разделы и создание файловых систем [104.1]
  20. Целостность и обслуживание ФС [104.2]
  21. Монтирование файловых систем [104.3]
  22. Урок 21. Права доступа и владение: rwx, chmod, umask и специальные биты
  23. Жёсткие и символические ссылки
  24. FHS и поиск файлов в системе [104.7]
  25. Окружение и кастомизация оболочки [105.1] (вы здесь)
  26. Урок 25. Написание простых bash-скриптов [105.2]
  27. Графика, рабочие столы и доступность
  28. Учётные записи пользователей и групп
  29. Автоматизация задач: cron, at, таймеры [107.2]
  30. Локализация и интернационализация [107.3]
  31. Системное время и синхронизация [108.1]
  32. Системное логирование [108.2]
  33. Основы почтового агента (MTA) [108.3]
  34. Печать и CUPS [108.4]
  35. Основы интернет-протоколов [109.1]
  36. Постоянная конфигурация сети [109.2]
  37. Диагностика сети [109.3]
  38. DNS на стороне клиента [109.4]
  39. Задачи администрирования безопасности [110.1]
  40. Настройка безопасности хоста [110.2]
  41. Шифрование данных: SSH и GnuPG [110.3]
Урок 24. Окружение и кастомизация оболочки [105.1]

Каждый раз, когда ты входишь по SSH или открываешь терминал, оболочка читает набор файлов и собирает себе окружение: где искать команды, как выглядит приглашение, какие сокращения работают. Если ты этого не понимаешь, то получаешь классику: alias работает в интерактивной сессии, но ломается в скрипте; PATH потерялся под cron; PROMPT свой у root и чужой у нового пользователя. В этом уроке разбираем, какие файлы и в каком порядке читает bash, чем login-сессия отличается от non-login, как объявлять переменные, псевдонимы и функции и как раздать всё это новым пользователям через /etc/skel.

Изображение

Как это работает

У процесса есть два разных набора переменных. Переменные оболочки видит только сам bash, а переменные окружения наследуют дочерние процессы. Команда export помечает переменную как экспортируемую: после этого она попадает в окружение и её увидит любая запущенная из оболочки программа. Без export переменная остаётся локальной для текущего процесса bash и до потомков не дойдёт - это первая причина, почему скрипт не видит то, что ты задал в терминале.

Bash различает сессии по двум осям. Первая: login или non-login. Login-shell - это первый процесс при входе в систему (консоль tty, ssh, su с дефисом). Non-login - это терминал, открытый внутри уже залогиненной графической сессии, или просто запуск bash вручную. Вторая ось: интерактивная (есть приглашение, ты печатаешь команды) или нет (выполняется скрипт). От этой комбинации зависит, какие файлы прочитаются.

Login-shell читает сначала /etc/profile (а тот через цикл подтягивает все *.sh из /etc/profile.d), затем первый найденный из ~/.bash_profile, ~/.bash_login, ~/.profile - именно первый, остальные игнорируются. Interactive non-login shell читает /etc/bash.bashrc (в Debian/Ubuntu; в RHEL аналог собирается из /etc/bashrc, вызываемого из профиля) и ~/.bashrc. Поэтому в большинстве систем ~/.bash_profile содержит строчку, которая вручную подтягивает ~/.bashrc - чтобы при login-входе тоже сработали алиасы и функции из bashrc. При выходе из login-сессии bash читает ~/.bash_logout.

Псевдоним (alias) - это простая текстовая подстановка первого слова команды, без аргументов и логики. Функция bash мощнее: она принимает позиционные параметры $1, $2, имеет тело из нескольких команд и возвращает код через return. И alias, и функции живут только в текущей оболочке и в дочерние процессы НЕ наследуются (экспорт функции через export -f - редкое исключение). Поэтому их место - в ~/.bashrc, который перечитывается для каждой новой интерактивной оболочки.

Команда source (она же точка - точка пробел имя_файла) выполняет файл в ТЕКУЩЕЙ оболочке, а не в дочерней. Это принципиально: обычный запуск скрипта порождает новый bash, и все заданные там переменные и функции умирают вместе с ним. А source применяет изменения к твоей живой сессии - именно так перечитывают ~/.bashrc после правки, не разлогиниваясь.

Команды и примеры

Переменные, экспорт и просмотр окружения:

Код: Выделить всё

MYVAR=hello            # переменная оболочки, потомки её не видят
export MYVAR           # теперь это переменная окружения
export EDITOR=vim      # объявить и экспортировать сразу
echo "$MYVAR"
env | grep MYVAR       # env показывает ТОЛЬКО экспортированные
set | grep MYVAR       # set показывает все переменные и функции оболочки
unset MYVAR            # удалить
printenv PATH          # одна переменная окружения
Разница set и export наглядно: set без аргументов печатает все переменные оболочки и функции, а ещё управляет опциями оболочки (set -o). env и printenv показывают только окружение. Добавить каталог в PATH правильно:

Код: Выделить всё

export PATH="$PATH:$HOME/bin"   # дописать в конец, не затирая старое
Псевдонимы:

Код: Выделить всё

alias ll='ls -lah --color=auto'
alias                      # список всех алиасов
alias gs='git status'
\ls                        # обратный слэш игнорирует алиас разово
unalias ll                 # снять один
unalias -a                 # снять все
Функция bash - когда нужна логика и аргументы:

Код: Выделить всё

mkcd() {
    mkdir -p -- "$1" && cd -- "$1"
}
mkcd ~/projects/test       # создать каталог и сразу войти
Перечитать конфиг без перелогина (два равнозначных способа):

Код: Выделить всё

source ~/.bashrc
. ~/.bashrc
Файлы инициализации по семействам. В Debian 13 / Ubuntu 24.04 общесистемный интерактивный конфиг - /etc/bash.bashrc, в RHEL 10 / Fedora 41+ его роль играет /etc/bashrc, который подключается из /etc/profile.d или профиля. Положить свой системный скрипт правильнее всего в drop-in:

Код: Выделить всё

# и Debian, и RHEL читают это при login-входе:
sudo tee /etc/profile.d/mycorp.sh >/dev/null <<'EOF'
export CORP_REGION=eu
umask 027
EOF
# применится при следующем login; проверить сейчас:
source /etc/profile.d/mycorp.sh
Скелет нового пользователя. Каталог /etc/skel - это шаблон домашней папки: его содержимое копируется в HOME при создании пользователя через useradd -m (в Debian полезнее adduser, который делает то же плюс интерактив):

Код: Выделить всё

ls -la /etc/skel                 # обычно .bashrc .bash_profile .profile
sudo cp /etc/skel/.bashrc /etc/skel/.bashrc.bak
# правим /etc/skel/.bashrc - добавляем корпоративные алиасы
sudo useradd -m -s /bin/bash anna   # -m копирует /etc/skel в /home/anna
# уже существующим пользователям skel задним числом НЕ применяется
Частые грабли
  • Поправил ~/.bashrc, а под ssh ничего не изменилось - потому что ssh даёт login-shell, который читает ~/.bash_profile, а тот не делает source ~/.bashrc. Добавь в ~/.bash_profile строку: if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
  • Переменная работает в терминале, но не видна программе - забыл export. Без него потомки переменную не наследуют.
  • PATH="$HOME/bin" без $PATH в начале или конце затирает системные пути - и перестают находиться обычные команды. Всегда дописывай, а не присваивай с нуля.
  • Алиас не работает в скрипте: неинтерактивные оболочки по умолчанию не разворачивают алиасы, да и ~/.bashrc для них не читается. В скриптах используй функции, а не alias.
  • Запустил конфиг как ./.bashrc вместо source - изменения ушли в дочерний bash и пропали. Перечитывать только через source или точку.
  • Поправил /etc/skel и ждёшь, что у старых пользователей всё обновится - нет, skel копируется ОДИН раз при создании. Существующим раздавай вручную или через /etc/profile.d.
  • export PATH в ~/.bashrc вместо ~/.bash_profile приводит к дублированию пути при каждом запуске вложенной оболочки - PATH-присваивания держи в profile, интерактивные настройки в bashrc.
Мини-лаба
  • Выполни echo $$ и сравни вывод env и set по своей тестовой переменной: задай TEST=1 без export, проверь, что env её не показывает, потом export TEST и проверь снова.
  • Открой два терминала: один по ssh (login), другой - в графической сессии (non-login). В каждом выполни shopt -q login_shell и сравни код возврата (echo $?).
  • Добавь в ~/.bashrc алиас и функцию mkcd из урока, выполни source ~/.bashrc, убедись, что они работают.
  • Создай /etc/profile.d/lab.sh с export LAB_OK=yes, разлогинься и зайди заново - проверь printenv LAB_OK.
  • Сравни /etc/skel/.bashrc с твоим ~/.bashrc через diff и пойми, что ты накрутил поверх шаблона.
  • Создай пользователя useradd -m testskel, зайди под ним (su - testskel) и проверь, что файлы из skel на месте.
Контрольные вопросы
  • Чем переменная оболочки отличается от переменной окружения и какая команда превращает первую во вторую?
  • Какие файлы и в каком порядке читает interactive login-shell, а какие - interactive non-login shell?
  • Почему правка ~/.bashrc может не подействовать при входе по ssh и как это чинят?
  • В чём разница между запуском скрипта как ./script.sh и через source script.sh?
  • Когда содержимое /etc/skel попадает в домашний каталог пользователя и применяется ли оно к уже существующим аккаунтам?
  • Почему alias не стоит использовать в скриптах и чем его заменить?
👍5 ❤️4 🔥1 😄 🤔1
Аватара пользователя
semyon9
Сообщения: 1
Зарегистрирован: 15 май 2026, 09:45

Re: Окружение и кастомизация оболочки [105.1]

Сообщение semyon9 »

А есть простой способ понять, login у меня сейчас shell или нет? Вечно путаюсь какой файл править.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
goninja
Сообщения: 1
Зарегистрирован: 29 май 2026, 14:19

Re: Окружение и кастомизация оболочки [105.1]

Сообщение goninja »

Подтверждаю грабли с ssh: добавил alias в .bashrc, локально работает, по ssh нет. Дописал в .bash_profile source ~/.bashrc и заработало.
👍 ❤️2 🔥 😄 🤔
Ответить
← Предыдущая глава
FHS и поиск файлов в системе [104.7]
Следующая глава →
Урок 25. Написание простых bash-скриптов [105.2]

Все главы курса «LPIC-1: администратор Linux (101 + 102)»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «LPIC-1: администратор Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость