Идея состоит в том, что пользователь должен иметь (максимум) одну оболочку входа в систему на хост. (Возможно, я должен сказать, что одна оболочка входа в систему на узел на терминал - если вы одновременно входите в систему через несколько терминалов, вы ожидаете иметь несколько оболочек входа.) Обычно это (всегда?) Будет первая оболочка, которую вы получите при входе в систему (отсюда и название). Таким образом, эта схема позволяет вам указывать действия, которые вы хотите выполнять только один раз для каждого входа в систему, и вещи, которые вы хотите выполнять каждый раз, когда запускаете новую (интерактивную) оболочку.
Обычно любая другая оболочка, которую вы запускаете после входа в систему, является потомком (потомком потомка потомка…) оболочки входа в систему и, следовательно, наследует многие параметры (переменные среды umask
и т. Д.) Из оболочки входа. И, соответственно, идея состоит в том , что файлы инициализации Логин ( .login
, .profile
и т.д.) необходимо установить параметры , которые являются наследуемыми, и пусть .bashrc
(или то , что вы используете) обрабатывать те, которые не являются ( set
, shopt
, неэкспортированной переменные оболочки , так далее.)
Другое понятие состоит в том, что файлы инициализации входа в систему (и только они) должны выполнять «тяжелую работу», то есть ресурсоемкие действия. Например, вы можете захотеть, чтобы определенные процессы выполнялись в фоновом режиме при каждом входе в систему (но только одна их копия (экземпляр)). Возможно, вы захотите, чтобы некоторая информация о состоянии (например, df
или who
) отображалась при входе в систему, но не каждый раз при запуске новой интерактивной оболочки. Особенно если у вас есть интерактивныйПрограмма / диалог (т. е. та, которая требует ввода от вас), которую вы хотите запускать при каждом входе в систему, вы, вероятно, не хотите запускать ее каждый раз, когда запускаете новую оболочку. В качестве крайнего примера, двадцать лет назад Solaris зарегистрировал вас в единственной неграфической оболочке без окон. (Я считаю, что с тех пор все изменилось.) Это была задача .login
или .profile
(или что-то еще) запустить систему управления окнами с помощью команды вроде startx
. (Это было полезно отчасти потому, что было доступно несколько оконных систем. У разных пользователей были разные предпочтения. Некоторые пользователи использовали разные системы в разных ситуациях, и у нас был диалог, в .profile
котором спрашивалось «Какую оконную систему вы хотите использовать сегодня?») Очевидно, вы не хотели бы, чтобы это запускалось каждый раз, когда вы открываете новое окно или набираетеsh
,
Прошло много лет с тех пор, как я использовал что-то другое, bash
кроме крайних случаев. (Например, я пишу сценарии с #!/bin/sh
, поэтому в некоторых системах мои сценарии запускаются dash
, а в других - bash
в режиме POSIX. Несколько раз в год я запускаю csh
/ tcsh
в течение нескольких минут, чтобы посмотреть, как он что-то обрабатывает, или ответьте на вопрос.) Если вы используете несколько оболочек (например, bash
и zsh
) ежедневно, ваши схемы могут отличаться. Если ваша основная оболочка (как определено в /etc/passwd
) есть bash
, вы можете вызвать zsh
оболочку входа в систему, а затем, возможно, вызвать некоторые интерактивные zsh
оболочки без входа в систему, подчиненные этому. Вам, вероятно, следует избегать использования оболочки входа, которая подчиняется другой оболочке входа того же типа.
Как упомянуто в Разнице между Оболочкой входа в систему и Оболочкой не входа в систему? приложение терминала OS X запускает оболочку входа в систему, поэтому у обычного пользователя обычно будет несколько «оболочек входа», работающих одновременно. Эта модель несколько отличается от той, которую я описал выше, и может потребовать от пользователя переосмыслить то, что он делает в своей .login
или.profile
(или любой другой) файл. Я не знаю, документировали ли разработчики OS X свое обоснование этого дизайнерского решения. Но я могу представить ситуацию, в которой это было бы полезно. Было время, когда я обычно открывал несколько окон оболочки, когда входил в систему, и я устанавливал для них разные цвета текста и фона (записывая escape-последовательности ANSI на экран), чтобы помочь мне отслеживать, какие именно. Терминальные цвета являются примером того, что не наследуется дочерними элементами, но сохраняется в окне. Так что это то, что вы хотели бы делать каждый раз, когда вы запускаете новое окно терминала, но не каждый раз, когда вы запускаете новую интерактивную оболочку.