Всё про типы оболочек

Linux — это не только Bash или Zsh. Тут есть целый зоопарк оболочек: Login, Non-Login, Interactive, Restricted и ещё пара странных экземпляров. Разберёмся, что к чему.



В linux существует куча всяких оболочек, я имею в виду не bash/zsh, а конкретно их типы: login, non-login, interactive, restricted и т.п.

Очередной зоопарк с которым особо никто не разбирается. Давай закроем эту дырку.

Interactive Shell — ну тут ежу понятно, ты вводишь в терминале буковки, а оно тебе в ответ что-то выдаёт. Интерактивно? Конечно! По умолчанию именно этот тип стартует при запуске терминала.

На этом можно и закончить, но хуй там плавал, поехали дальше.


Non-Interactive — Логично? Логично! Этот тип используется в основном для выполнения скриптов или задач в кроне.

Когда ты запускаешь скрипт: ./bashdays.sh, интерактивная оболочка смотрит в скрипт и такая — ага, вижу shebang (#!/bin/sh) Запускаю интерпретатор sh.

Это и будет считаться не интерактивной оболочкой, все запустится где-то там внутри, в кишках.

Что интересно, при запуске в такой оболочке все твои настройки в .profile/.bashrc игнорируются.

Почему? Из-за совместимости, вдруг ты в .bashrc нахуячил своих переменных и команд, а потом решил этот скрипт перенести на другую машину где нет этих переменных и команд. Такие дела.

Мнение эксперта
Роман Шубин
Роман Шубин
CEO & CTO, действующий девопс-инженер в «Цифровой улей»
Задать вопрос
И в большинстве случаев здесь кроется проблема с выполнением скрипта из крона. Ручками запускаешь — работает. А из крона — нет! Потому что проигнорированы твои поделки в .bashrc и profile.

Как вариант, пиши #!/bin/bash или в кроне явно указывай как запускать твой скрипт: bash script.sh

Login = Запускается при входе в систему (например через ssh). Оболочка входа перечитывает файлы: /etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profile.

Чтобы определить текущий тип оболочки, запусти команду:

echo $0


Если вывод начинается со знака «-» это и есть login shell.

Ну или так:

[[ $- == i ]] && echo "Interactive" || echo "Non-Interactive"


Non-Login = запускается из существующей сессии (например, внутри терминала из GUI). То есть не требуется авторизация. Не читает ~/.bash_profile вместо этого использует ~/.bashrc.

Нипонятно… давай на примере:

  1. Ты приходишь домой с работы.
  2. Зашел через парадную дверь Login Shell.
  3. Снимаешь трусы, всё происходит по определённым правилам (файл .bash_profile).

Что происходит:

  • Ты готов к долгому пребыванию дома.
  • Тебя «встречают» файлы конфигурации входа (.bash_profile).
  1. Ты внутри дома, и открываешь окно, чтобы покурить.
  2. Non-Login Shell = это как открыть окно внутри дома.
  3. Ты не снимаешь трусы заново — ты уже дома!

Файлы .bash_profile не используются, потому что ты уже «внутри». Вместо этого, ты используешь «внутренние» правила дома (это как .bashrc).

Login Shell: Зашёл в дом через дверь — загружается .bash_profile.

Non-Login Shell: Открыл окно, уже находясь в доме — загружается .bashrc.

Restricted Shell = ограниченная оболочка, кастрированные команды, закрученные гайки. Обычно делают для безопасности, чтобы криворукий юзер ничо не сломал.

Возможно ты слышал про rbash, это оно и есть.

System Shell = системная оболочка, используется системой для выполнения фоновых задач и скриптов инициализации (init, systemd). Зачастую это /bin/sh.

Subshell = Подоболочка, создается при выполнении скрипта или команд в скобках () или с помощью bash -c. Подоболочка наследует переменные родительской оболочки, но не влияет на них после завершения.

Например: (cd /tmp && ls)

Есть еще Interactive Login, Interactive Non-Login.

  1. Интерактивная оболочка, которая требует входа пользователя (например, через SSH).
  2. Интерактивная оболочка, открытая из GUI терминала, но не требует аутентификации пользователя.

➡️ Почитать про shebang
➡️ Почитать про файлы .profile/bashrc и т.п.

Да и вроде всё, закончился зоопарк, по крайней мере про другие типа оболочек я не слышал, либо забыл нахуй.

Напиши в комменты если что-то можно сюда еще приплести, будет интересно.

Увидимся! Шестидневная рабочая неделька обещает быть томной.