Почему у нас есть логин, не логин, интерактивные и неинтерактивные оболочки bash?

23

Итак, страницы руководства bash объясняют, что такое логин и интерактивные оболочки:

Оболочка входа - это та, чей первый символ аргумента ноль - -, или тот, который начинается с опции --login.

Интерактивная оболочка запускается без аргументов без опций и без опции -c, стандартные входные данные и ошибки которых связаны с терминалами (как определено isatty (3)), или запускается с опцией -i. PS1 установлен, а $ - включает i, если bash интерактивен, что позволяет сценарию оболочки или файлу запуска проверить это состояние.

Я думаю, это означает, что у нас может быть 4 различных типа снарядов:

  • Интерактивные логины,
  • Неинтерактивные логины,
  • Интерактивные оболочки без логина,
  • Неинтерактивные оболочки без логина

Но почему у нас в первую очередь интерактивные / неинтерактивные оболочки и входные / не входящие в систему оболочки? Почему разнообразие? Что бы мы потеряли, если бы у нас был только один тип оболочки?

Также при попытке определить, нахожусь ли я в оболочке входа в систему echo $-, она выдает:

himBH

Некоторые из этих флагов объясняются здесь , но h, Hи mне объяснены. Есть ли место, которое описывает все эти флаги?

TheFooProgrammer
источник

Ответы:

21

Это мои мысли о различных «типах» оболочек - к сожалению, я не был свидетелем подъема Un * x с самого начала (я предполагаю, что эта концепция исторически выросла до хорошей степени), поэтому, пожалуйста, будьте критически настроены.

  • Когда я вхожу в систему (в настоящее время через графический вход в систему X), могут возникнуть некоторые задачи, которые должны быть выполнены один раз, например, установить соединение с каким-либо сервером, предоставить мне список текущих задач сегодняшнего дня, автоматически запустить некоторые команды и т. Д. не должно случаться каждый раз, когда я открываю новый терминал. Таким образом , есть набор конфигурационных файлов ( /etc/profile, ~/.bash_loginи так далее, обратитесь к руководству для точного списка) источники только для входа оболочек.
  • Соответственно, чтобы закрыть соединения, убить некоторые программы, запустить скрипт резервного копирования там, ~/.bash_logoutгде существует оболочка входа .
  • Итак, «нормальная» оболочка, которую я использую в терминале, не должна содержать оболочку входа в систему , но, тем не менее, должна считывать мои личные предпочтения ~/.bashrc, потому что я хочу, чтобы мои сочетания клавиш взаимодействовали с оболочкой - следовательно, это интерактивная, не оболочка входа
  • и последнее, но не менее важное, когда bash используется для сценариев, и это не важно. bashдолжен запускаться так быстро, как может, т.е. не должен читать никаких файлов конфигурации. Это неинтерактивная оболочка без авторизации .

Итак, мой ответ на ваш вопрос Что бы мы потеряли, если бы у нас был только один тип оболочки? Одним словом: «Гибкость».


Ответ на ваш второй вопрос прост:

$-перечисляет текущий набор параметров. Они могут быть установлены с помощью параметров командной строки bashили setвстроены. Итак, вы должны взглянуть на два места в руководстве:

  • OPTIONS раздел:

    -i        If the -i option is present, the shell is interactive.
  • SHELL BUILTIN COMMANDSраздел, подраздел set:

    -h      Remember the location of commands as they are looked up for execution.  This is enabled by default.
    -m      Monitor  mode.  Job control is enabled.  This option is on by default for interactive shells on systems that sup
            port it (see JOB CONTROL above).  Background processes run in a separate process  group  and  a  line  containing
            their exit status is printed upon their completion.
    -B      The shell performs brace expansion (see Brace Expansion above).  This is on by default.
    -H      Enable !  style history substitution.  This option is on by default when the shell is interactive.
МРУ
источник
1
Ву, я думаю, @mpy ответ на четко сформулированный вопрос OP может успешно привести к неоднозначному определению довольно полезного определения. О том: Итак, не входящая в систему оболочка просто является подмножеством входной оболочки, верно?
tuk0z