ПОЧЕМУ **login** shell лучше **non-login** shell?

В этом случае : не команда, это имя функции, которую вы определяете.Команда : () {: |: &};: - это то, что называется "forkbomb" - это последовательность команд, которая определяет функцию с именем : , сообщите оболочке, что функция состоит из вызова : , передачи вывода в другой экземпляр : и создания фона для второго экземпляра. Последняя последовательность ;: завершает определение функции и затем вызывает ее. Каждый вызов : приводит к запуску еще двух копий : со скоростью, с которой оболочка может их порождать.
Это приведет к израсходованию всех системных ресурсов, что в конечном итоге приведет к замедлению работы системы или ее сбою, если не установлено ограничение на процесс.

26
13.04.2017, 15:36
1 ответ

Идея состоит в том, что у пользователя должна быть (не более) одна оболочка входа на хост. (Возможно, я должен сказать, одна оболочка входа на хост для каждого терминала - если вы одновременно вошли на хост через несколько терминалов, вы ожидаете, что у вас будет несколько оболочек входа .) Обычно (всегда?) Это первая оболочка, которую вы получаете при входе в систему (отсюда и название). Итак, эта схема позволяет вам указывать действия, которые вы хотите выполнять только один раз при входе в систему , и то, что вы хотите выполнять каждый раз, когда вы запускаете новая (интерактивная) оболочка.

Обычно каждая другая оболочка, которую вы запускаете после входа в систему , будет потомком (дочерним по отношению к дочернему элементу…) оболочки входа, и поэтому он унаследует многие настройки (переменные среды, umask и т. д.) от оболочки входа. И, соответственно, идея состоит в том, что файлы инициализации входа в систему ( .login , .profile и т. Д.) Должны устанавливать следующие параметры: наследуемый, и пусть .bashrc (или что-то еще, что вы используете) обрабатывает те , которые не ( set , shopt , неэкспортированные переменные оболочки и т. Д.)

Еще одно понятие состоит в том, что файлы инициализации входа в систему (и только они) должны выполнять «тяжелую работу», т. Е. Ресурсоемкие действия. Например, вы можете захотеть, чтобы определенные процессы выполнялись в фоновом режиме, когда вы входите в систему (но только одну их копию (экземпляр)). Вы можете захотеть, чтобы некоторая информация о статусе (например, df или who ) отображалась при входе в систему, но не каждый при запуске новой интерактивной оболочки. Особенно, если у вас есть интерактивная программа / диалоговое окно (т. Е. Которое требует от вас ввода данных) , которое вы хотите запускать каждый раз при входе в систему, вы, вероятно, не хотите, чтобы он запускался каждый раз при запуске новой оболочки. В качестве крайнего примера, двадцать лет назад Solaris зарегистрировал вас в единой, неграфической оболочке без окон. (я считаю, что с тех пор он изменился.) Это была работа .login или .profile (или чего-то еще) {{1 }} для запуска оконной системы с помощью команды типа startx . (Это было полезно отчасти потому, что было доступно несколько оконных систем. У разных пользователей были разные предпочтения. Некоторые пользователи использовали разные системы в разных ситуациях, {{ 1}} и у нас был диалог в нашем .profile , который спрашивал «Какую оконную систему вы хотите использовать сегодня?») Очевидно, вы бы не захотели чтобы запускать каждый раз, когда вы открываете новое окно или набираете sh .

Прошло много времени с тех пор, как я использовал что-либо, кроме bash , кроме крайних случаев. (Например, я пишу сценарии с #! / Bin / sh , поэтому в некоторых системах мои сценарии выполняются с тире , {{ 1}}, а на других они работают с bash в режиме POSIX. Несколько раз в год я запускаю csh / tcsh на несколько минут , чтобы посмотреть, как он что-то обрабатывает, или чтобы ответить на вопрос.) Если вы ежедневно используете несколько оболочек (например, bash и zsh ), ваши шаблоны могут отличаться. Если ваша основная оболочка (как определено в / etc / passwd ) - bash , вы можете вызвать zsh ] оболочку входа в систему, и затем, возможно, вызовите некоторые подчиненные ей интерактивные оболочки без входа в систему zsh . Вам, вероятно, следует избегать использования оболочки входа , которая подчиняется другой оболочке входа в систему того же типа.

Как упоминалось в Разница между оболочкой входа и оболочкой без входа? , приложение терминала OS X запускает оболочку входа, поэтому обычный пользователь обычно имеет несколько «оболочек входа», работающих одновременно. Эта модель несколько отличается от той, которую я описал выше, и может потребовать от пользователя переосмысления того, что он делает в своем .login или .profile (или любой другой) файл. Я не знаю, задокументировали ли разработчики OS X свое обоснование этого проектного решения. Но я могу представить ситуацию, в которой это было бы полезно. Было время, когда я обычно открывал несколько окон оболочки при входе в систему, и устанавливал для них разные цвета текста и фона ( путем написания управляющих последовательностей ANSI на экране) , чтобы помочь мне отследить, какие из них были. Цвета терминала - это пример чего-то , что не наследуется дочерними элементами, , но сохраняется в окне. Так что это то, что вы хотели бы делать каждый раз, когда вы запускаете новое окно Терминала, но не каждый раз, когда вы запускаете новую интерактивную оболочку.

42
27.01.2020, 19:40

Теги

Похожие вопросы