До появления графических пользовательских интерфейсов пользователи взаимодействовали с компьютером с помощью терминала командной строки. Программа, которая интерпретирует команды и предоставляет их операционной системе для выполнения, называется оболочкой. В этой статье мы обсудим шаги, которые выполняет оболочка Linux для интерпретации команды: `ls -l`.

`ls -l` — это базовая команда, которая выполняет команду `ls`, которая выводит список содержимого каталога, и использует флаг `-l`, чтобы указать, что содержимое должно быть перечислено в формате длинного списка, но мы скоро увидите, насколько сложным становится, когда дело доходит до функциональности оболочки. Первый шаг — токенизация. Оболочка должна интерпретировать единственную строку «ls -l», которую мы затем передаем функции, которая разбивает строку на отдельные «токены». В этом примере 'ls -l' состоит из двух токенов, 'ls' и '-l' Для этого мы используем `strtok()`, функцию, которая анализирует строки по определенному разделителю, то есть пробелу. или двоеточие. В этом случае мы разделяем токены, используя пробел между ls и -l в качестве разделителя. Эта функция заменяет найденные разделители специальным символом, называемым нулевым терминатором, который разделяет одну строку на отдельные строки (токены), позволяя легко вставлять их в матрицу или массив строк. Итак, в нашем примере исходная строка «ls -l» теперь представляет собой матрицу, указывающую на первую строку «ls» и вторую строку «-l», за которой следует NULL-терминатор, обозначающий конец матрицы.

И это был только первый шаг! Это было просто для того, чтобы иметь доступ к каждой части команды отдельно. Теперь, когда у нас есть прекрасная матрица разделенных строк, следующее, что сделает за нас оболочка, — это проверка псевдонимов и встроенных функций. Это означает, что если мы, как пользователи, установили какие-либо псевдонимы — имена, обозначающие другие вещи — или встроенные — такие команды, как «выход», которые «встроены» в оболочку — оболочка проверит нашу матрицу. против этих строк, чтобы увидеть, что выполнять.

А теперь переходим к самому интересному: исполнению. Чтобы поговорить о выполнении файлов и выполнении команд, нам нужно поговорить о такой вещи, как PATH. Путь представляет собой список каталогов внутри вашего компьютера, разделенных двоеточиями. Путь — это всего лишь одна строка в матрице строк, хранящихся в специальной переменной среды. Переменная среды содержит данные и сведения о конфигурации, которые могут быть полезны приложению. Одна из строк в этой среде содержит PATH. PATH полезен, потому что он содержит каталоги, в которых оболочка должна искать исполняемые файлы. В нашем примере `ls` на самом деле является лишь одной из многих программ, которые находятся в каталоге `/bin/`. Когда пользователь вводит команду или программу для выполнения, она проверяет, находится ли она в одном из каталогов PATH. Без PATH пользователь должен был бы ввести абсолютный путь к программе для выполнения, в данном случае `/bin/ls`, чтобы выполнить программу `ls`. Однако, поскольку оболочка автоматически проверяет, что программа для выполнения находится в одном из каталогов PATH, все, что нужно сделать пользователю, это ввести `ls`, и оболочка по-прежнему сможет выполнять

нужную программу. Таким образом, следующая задача оболочки — просмотреть всю матрицу строк (окружение), пока не будет найден ПУТЬ.

Итак, оболочка находит совпадение! Он находит слово «PATH» в среде, и теперь ему нужно прикрепить переданную нами команду «ls» к каждому файлу, который он находит в пути, пока не найдет совпадение.

Есть несколько разных способов проверить существование файла и, кроме того, проверить его доступность и его исполняемость. Независимо от того, как это делает программист, в конечном итоге происходит то, что «ls» прикрепляется к каталогам в пути, пока не найдет исполняемый файл, который он искал. Например, «/usr/bin/ls» — это исполняемый файл, поэтому это будет последняя строка, которую мы передаем следующей функции.

Это, наконец, доходит до той части, которую мы так долго ждали. Функция запускает команду «ls -l». Он был разделен, найден в пути, присоединен к строке в пути, нашел свой дом в пути, и там запускается программа `ls` и внутри `ls, -l` вариантов, разрешенных для форматирования списка содержания.

Оболочка выполнила свою основную работу. Ну что теперь? Что ж, теперь, когда программа «ls» запущена и содержимое файла выводится в приглашение с помощью PS1(), оболочка перезагружается и снова готова к запуску. То, как оболочка работает на высоком уровне, заключается в том, что она, скажем, постоянно застревает в бесконечном цикле while. Вот почему мы можем продолжать выполнять команду за командой за командой. Он будет продолжать ожидать команды, пока не будет подан сигнал EOF или сигнал закрытия.

Подводя итог, основное описание того, как оболочка обрабатывает команду `ls -l`, таково:

  1. Разделить команду на токены
  2. Проверить псевдонимы
  3. Проверить наличие встроенных модулей
  4. Найдите команду в ПУТИ
  5. Вызов программы
  6. Когда программа завершится, распечатайте приглашение с помощью PS1.
  7. Дождитесь новой команды

Существует множество задач, которые оболочка выполняет за кулисами, чтобы пользователь мог выполнять даже такие простые команды, как `ls -l`, для вывода списка каталогов. Оболочка способна интерпретировать многие более продвинутые команды с более мощными функциями, но мы надеемся, что с нашим описанием того, что оболочка выполняет с помощью этих основных команд, мы надеемся, что вы получили более глубокое понимание оболочки.