Понимание типов оболочек: interactive, non-interactive, login, non-login
Да-да, с оболочками есть еще и такой прикол. Многих людей сбивает с толку процесс настройки оболочек именно по тому, что они не в курсе о типовых различиях. Сегодня я постараюсь дать вам базовое понимание каждого из типов, чтобы потом легче было разобраться с конфигами.
Оболочки "interactive"
Максимально упрощая, интерактивная оболочка - та, с которой мы работаем через ручной ввод - мы печатаем команду, передаем ее оболочке на вход и видим результат по завершению. Когда вы запускаете терминал, оболочка стартует в интерактивном режиме.
Оболочки "non-interactive"
Это тот режим запуска оболочки, когда она не взаимодействуют напрямую с пользователем. Обычно они запускаются для выполнения команд или скриптов и завершаются по мере окончания задачи. Все же помнят про тот самый
shebang:
#!/bin/sh
Так вот, для запуска скрипта мы изначально открываем
bash (интерактивная оболочка) и указываем путь:
$ ./script.sh
Далее
bash запустит интерпретатор
sh (неинтерактивная оболочка), после чего тот "втихую" выполнит скрипт.
Это
ВАЖНО помнить! Скрипты отрабатывают в неинтерактивных оболочках и ваши настройки в файле "
~/.bashrc" окажутся бесполезными. Почему такие оболочки не подгружают конфиги? Хороший вопрос. Есть несколько причин:
1) скрипту не следует полагаться на пользовательские настройки - быть "
пользователезависимым". Если юзер "настругал" скрипт, опираясь, допустим, на свои
алиасы, будет нарушена портируемость и у другого человека он, вероятно, не стартанет.
2) чтение и отработка конфигов может занимать время. Без дополнительных подготовок скрипт банально быстрее отработает.
Оболочки "login"
Такая оболочка создается первым пользовательским процессом, когда тот успешно логинится в системе и открывает сессию через
tty или
ssh. Если вы авторизовались через GUI - дисплей менеджер, "
login shell" обычно заменяется оконным менеджером либо менеджером сессии.
Данный тип оболочки не создается все время, как мы открываем терминал и отличается тем, что читает дополнительные конфиги. Явно его можно идентифицировать по префиксу '
-' для исполняемого файла. Давайте зайдем пользователем через
tty и проверим:
$ ps -auxf
(root) /bin/login -p --
(user) \_ -bash
\_ ps -auxf
А теперь сами запустим еще одну оболочку внутри родительской и убедимся, что статус "
login shell" выдается невсегда:
$ bash
$ ps -auxf
/bin/login -p --
\_ -bash
\_ bash
\_ ps -auxf
Также узнать тип оболочки можно через переменную '0':
$ echo $0
-bash
Оболочки "non-login"
Создаются при обычном старте - без авторизации пользователя. Все, что нужно для инициализации такой оболочки - просто открыть терминал либо самому запустить исполняемый файл без дополнительных флагов, которые переводят оболочку в режим "
login": "
-l" и "
--login".
Linux++ | IT-Образование