23

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

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

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

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

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

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

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

himBH

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

1 ответ1

20

Это мои мысли о различных "типах" оболочек - к сожалению, я не был свидетелем подъема 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.
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .