HPUNIX Сайт о ОС и не только!

Как работает интепретатор bash

9 октября 2008 - unix

Приветствую всех, кто пришел на мой блог. В данной статье, желаю предоставить малеханькое введение в принцип (последовательность) работы командного интерпретатора bash. Другими словами как шелл оболочка bash понимает (читай: интерпретирует) где команда, где свойства команды, где функции и вообще какие они, эти функции, и в итоге, что с командой и ее опциями и параметрами нужно сделать...

Итак, после ввода команды и нажатия Enter, оболочка bash:

  1. После ввода команды и нажатия кнопки Enter делается развертывание (подстановка) черт в строке команды. Развертываниепроисходит в строго определенной последовательности:
    1. Развертывание фигурных скобок. При указании в фигурных скобках нескольких значений через запятую, итоговое значение разворачивается в список строк, содержащих каждое значение в скобках, например значение file{12,13,14}.txt будет развернуто в file12.txt file12.txt file14.txt.
    2. Развертывание тильды. Знак тильды заменяется значением переменной $HOME, при условии, что строка образует верный логин. Если имя пользователя не является зарегистрированным в системе, то тильда не заменяется. Пример:
      $ echo $HOME /home/mc-sim $ echo ~ /home/mc-sim $ echo ~123 ~123
    3. Развертывание черт. На данном шаге происходит замена позиционных переменных.
    4. Развертывание переменных. На данном шаге происходит подстановка значений переменных. (если переменная пустая или на задана, то и значение ее будет пустым). Чтобы запретить bash'у подстановку значений переменных, их необходимо экранизировать (литерализировать):
      $ echo $person McSim $ echo "$person" McSim $ echo '$person' $person $ echo \$person $person

      одинарные кавычки запрещают подстановку переменных, а символ \ экранирует $, которые указывает на то что $person - это переменная.

    5. Подстановка команды. Команду, заключенную в меж $( и ) (аналог этой композиции - заключение в обратные кавычки (`)) делает и ее результат передается интерпертатору/предыдущей команде.
    6. Развертывание арифметических выражений. Происходит поиск и вычисление арифметического выражения и заменяется результатом выражения. Выражение имеет формат: $[сумма+или+разность+или+еще=итог].
    7. Разбиение на слова. Шелл разбирает на элементы (слова) - строку команды. Какие знаки оболочка будет использовать для разделения частей команды, определяются в переменной $IFS.
    8. Развертывание путей. Развертывание путей заключается в подстановке файловых шаблонов (неоднозначных имен путей) по следующим правилам:
      1. * - хоть какой набор символов
      2. ? - хоть какой один символ
      3. [abc...] или [a-c] - хоть какой символ в квадратных скобках (при всем этом: знаки '*' и '?' означают сами себя, а символ '!' означает 1-ый символ диапазона)
      4. [^abc...] или [^a-c] - НЕ символ в квадратных скобках (отрицание)
      5. спецсимволы, предваренные \ (обратной косой чертой) числятся как обыденные и не обрабатываются как спецсимволы (экранируются)

      Basic Bash Scripting Lesson #1

  2. Далее bash проверяет наличие алиасов команд в /home/user_name/.bashrc (список имеющихся алиасов можно посмотреть командой alias)
  3. With All Due Respect - an awkward interpretation

  4. Ищет команду в следующем порядке:
    1. Среди встроенных в интерпретатор команд
    2. Ищет команду в каталогах, обозначенных в переменной $PATH (список каталогов можно получить командой echo $PATH
      Примечание: если в имени команды есть символ "/", то интерпретатор запускает команду по пути (без поиска в $PATH)
  5. Как работает интепретатор bash
  6. Делает инетерпертированную команду, при всем этом:
    1. При разделении команд знаками &&, следующая команда делается, только если предыдущая завершилось с кодом 0 (ноль), другими словами без ошибок.
    2. При разделении команд знаками ||, следующая команда делается, только если предыдущая завершилось с НЕ нулевым значением.
    3. При разделении команд знаком ; (точка с запятой), следующая команда делается после окончания предыдущей, не зависимо от результата.
    4. При объединении команд в () (круглые скобки),  команды группируются и обрабатываются отдельной копией шелла, соответственно со своими переменными и окружением, которое может отличаться от других, не включенных в скобки.
    5. Если после команды или группы команд, заключенных в скобки, стоит символ &, то команда делается в фоновом режиме.
    6. Если в строке команды употребляются знаки < или >, то делается перенаправление потоков.

Желаю узреть, что при запуске, bash попеременно читает следующие конфигурационные файлы: /etc/profile, /home/Linux_user/.bash_profile, /home/Linux_user/.bash_login, /home/Linux_user/.profile, /home/Linux_user/.bashrc (данный файл читается только не логин-оболочкой). В данных файлах хранятся функции окружения bash (переменные, локаль и др.). Если есть необходимость поменять значение основных переменных, обрисованных в файлах $HOME/.bash_profile и др., без повторного входа в систему, необходимо выполнить команду:

$ . .bash_profile # точка пробел .bash_profile
Как работает интепретатор bash

Вот практически и вся схема работы.

Upd 2010.10.11: дополнил 5 пункт.
Upd 2011.01.18: дополнил пункт 5.6-5.7, а так же конфигурационные файлы.
Upd 2011.01.20: переработаны полностью и объединены Один и Два пункты.

Похожие статьи

  • Композиции кнопок для работы в интерпретаторе Bash

    В сегодняшней статье собственного блога напишу, какими комбинациями кнопок может быть пользоваться в интерпретаторе bash. На самом деле, на практике очень убеждаешься, на сколько упрощается жизнь и рабо...

  • Переменные Linux

    Привет, читателям моего блога. Не так издавна вызнал практически все о переменных в интерпретаторе bash. На данный момент желаю для вас об этом рассказать.Переменные в bash очень интенсивно используются при написании скрипто...

  • Постоянные выражения, базы для работы в Linux

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

  • Программные каналы и потоки Linux (UNIX), перенаправление потоков

    Неплохого времени, читатели моего блога!В данной статье желаю систематизировать свои зания по основным механизмам работы программных потоков и каналов в интерпретаторе и в общем в ОС Linux, а так ж...

  • Сервер печати CUPS

    Неплохого времени, читатели моего блога и гости. На данный момент желаю сделать небольшую заметку о системе печати Linux, чтобы ввести в курс дела и приготовить вас к следующей статье о сервере печати SAMBA...

Теги: ос linux, ос
Рейтинг: +4 Голосов: 58 754 просмотра
Комментарии (0)

Нет комментариев. Ваш будет первым!

Найти на сайте: параметры поиска

Windows 7

Среда Windows 7 на первых порах кажется весьма непривычной для многих.

Windows 8

Если резюмировать все выступления Microsoft на конференции Build 2013.

Windows XP

Если Windows не может корректно завершить работу, в большинстве случаев это

Windows Vista

Если к вашему компьютеру подключено сразу несколько мониторов, и вы регулярно...