В linux существует куча всяких оболочек, я имею в виду не bash/zsh, а конкретно их типы: login, non-login, interactive, restricted и т.п.
Очередной зоопарк с которым особо никто не разбирается. Давай закроем эту дырку.
Interactive Shell — ну тут ежу понятно, ты вводишь в терминале буковки, а оно тебе в ответ что-то выдаёт. Интерактивно? Конечно! По умолчанию именно этот тип стартует при запуске терминала.
На этом можно и закончить, но хуй там плавал, поехали дальше.
Non-Interactive — Логично? Логично! Этот тип используется в основном для выполнения скриптов или задач в кроне.
Когда ты запускаешь скрипт: ./bashdays.sh
, интерактивная оболочка смотрит в скрипт и такая — ага, вижу shebang (#!/bin/sh
) Запускаю интерпретатор sh.
Это и будет считаться не интерактивной оболочкой, все запустится где-то там внутри, в кишках.
Почему? Из-за совместимости, вдруг ты в .bashrc
нахуячил своих переменных и команд, а потом решил этот скрипт перенести на другую машину где нет этих переменных и команд. Такие дела.
Как вариант, пиши #!/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.
Нипонятно… давай на примере:
- Ты приходишь домой с работы.
- Зашел через парадную дверь Login Shell.
- Снимаешь трусы, всё происходит по определённым правилам (файл .bash_profile).
Что происходит:
- Ты готов к долгому пребыванию дома.
- Тебя «встречают» файлы конфигурации входа (.bash_profile).
- Ты внутри дома, и открываешь окно, чтобы покурить.
- Non-Login Shell = это как открыть окно внутри дома.
- Ты не снимаешь трусы заново — ты уже дома!
Файлы .bash_profile
не используются, потому что ты уже «внутри». Вместо этого, ты используешь «внутренние» правила дома (это как .bashrc
).
Login Shell: Зашёл в дом через дверь — загружается .bash_profile.
Non-Login Shell: Открыл окно, уже находясь в доме — загружается .bashrc.
Restricted Shell = ограниченная оболочка, кастрированные команды, закрученные гайки. Обычно делают для безопасности, чтобы криворукий юзер ничо не сломал.
System Shell = системная оболочка, используется системой для выполнения фоновых задач и скриптов инициализации (init, systemd). Зачастую это /bin/sh
.
Subshell = Подоболочка, создается при выполнении скрипта или команд в скобках () или с помощью bash -c. Подоболочка наследует переменные родительской оболочки, но не влияет на них после завершения.
Например: (cd /tmp && ls
)
Есть еще Interactive Login, Interactive Non-Login.
- Интерактивная оболочка, которая требует входа пользователя (например, через SSH).
- Интерактивная оболочка, открытая из GUI терминала, но не требует аутентификации пользователя.
➡️ Почитать про shebang
➡️ Почитать про файлы .profile/bashrc и т.п.
—
Да и вроде всё, закончился зоопарк, по крайней мере про другие типа оболочек я не слышал, либо забыл нахуй.
Напиши в комменты если что-то можно сюда еще приплести, будет интересно.
Увидимся! Шестидневная рабочая неделька обещает быть томной.