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