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

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

Interactive Shell

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

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

Non-Interactive Shell

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

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

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

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

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

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

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

Login Shell

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

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

echo $0

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

Ну или так:

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

Non-Login Shell

Запускается из существующей сессии (например, внутри терминала из 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 и т.п.

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

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

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