Чому у нас є вхідні, невхідні, інтерактивні та неінтерактивні базові оболонки?


23

Тож сторінки bash man пояснюють, що таке вхідні та інтерактивні оболонки:

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

Інтерактивна оболонка - це запущена без аргументів неопціонування та без параметра -c, стандартний вхід і помилка як з'єднані з терміналами (як визначено isatty (3)), так і інша, розпочата з опції -i. PS1 встановлений, а $ - включає i, якщо bash є інтерактивним, що дозволяє скрипту оболонки або файлу запуску перевірити цей стан.

Я думаю, це означає, що ми можемо мати 4 різних типи снарядів:

  • Інтерактивні оболонки для входу,
  • Неінтерактивні оболонки для входу,
  • Інтерактивні оболонки без входу,
  • Неінтерактивні оболонки без входу

Але чому ми маємо в першу чергу інтерактивні / неінтерактивні оболонки для входу / не входу? Чому сорт? Що б ми втратили, якби у нас був лише один тип оболонки?

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

himBH

Деякі з цих прапорів пояснюються тут , але h, Hі mне пояснили. Чи є місце, де описані всі ці прапори?

Відповіді:


21

Це мої думки щодо різних "типів" снарядів - на жаль, я не був свідком підйому Un * x з самого початку (я припускаю, що ця концепція виросла історично в достатній мірі), тому, будь ласка, будьте критичні.

  • Коли я входжу в систему (сьогодні через графічний логін X), можуть виникнути деякі завдання, які слід виконати один раз, наприклад встановити з'єднання з якимось сервером, представити мені сьогоднішній список todo, автозапустити деякі команди тощо. Це не слід чекати кожного разу, коли я відкриваю новий термінал. Таким чином , є набір конфігураційних файлів ( /etc/profile, ~/.bash_loginі так далі, зверніться до керівництва для точного списку) джерела тільки для входу оболонок.
  • Відповідно, щоб закрити з'єднання, вбити деякі програми, запустити сценарій резервного копіювання там, ~/.bash_logoutколи оболонка входу існує.
  • Отже, "звичайна" оболонка, яку я використовую в терміналі, не повинна мати оболонку для входу , але все-таки повинна читати мої особисті налаштування ~/.bashrc, тому що я хочу, щоб мої клавіатурні зв'язки взаємоділи з оболонкою - отже, це інтерактивна, не- оболонка для входу .
  • І останнє, але не в останню чергу, коли баш використовується для сценаріїв, нічого з цього не важливо. 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
Woo Я вважаю, що відповідь @mpy на чітко сформульоване запитання ОП здатне успішно зневажити деякі досить корисні визначення. Про це: Отже, оболонка без входу в систему - це лише підмножина оболонки для входу?
tuk0z
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.