Что такое подсказка оболочки

Это приглашение оболочки, и на самом деле это информация, хранящаяся в переменной среды $PS1 с использованием формата для анализа, например, это моя $PS1:

Получение линии

Первое, что сделает любая оболочка, — это чтение из стандартного ввода, будь то через терминал или конвейер, оболочка должна прочитать строку или несколько из стандартного ввода, каждая строка заканчивается символом новой строки «\n».

Жемчужина оболочки: разбор

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

Фактическая работа: тестирование и выполнение

Правильный путь

Существует три типа команд: встроенная команда, такая как cd или exit, полный исполняемый файл или программа, расположенная в одном из каталогов в PATH.

Если это встроенная команда, она передаст аргументы системному вызову, будь то chdir (изменение каталога) или выход.

Иначе, если это псевдоним, мы преобразуем псевдоним и выполняем его с нижеприведенными проверками.

если это абсолютный путь к исполняемому файлу, программа разветвится, создав дочерний процесс, а затем выполнит программу с переменной среды родительского процесса.

Иначе, еслимы проверим его и соединим имя программы с каталогами внутри переменной окружения PATH, и если файл будет найден, произойдет разветвление — выполнение процедуры.

Иначе ни один из них не напечатает, что он не найден.

Исполнение

Давайте углубимся в выполнение программы:

  1. Мы разветвляем основной процесс, создавая дочерний процесс, используя системный вызов fork(), наследующий родительскую переменную среды.
  2. После разветвления мы проверяем, находимся ли мы в дочернем процессе, и выполняем команду, используя системный вызов execve(), давая ему программу для выполнения массива аргументов с исполняемым файлом в качестве первого элемента и средой, подобной execve(arg_array[0], arg_array, окружающая среда).
  3. Пока дочерний процесс выполняет программу, родительский процесс должен ожидать ее, используя системный вызов wait(), который сохраняет в своем аргументе статус дочернего процесса.

Аргументы сложны

ls -l *.c

В нашем примере команды есть часть, которую мы не упомянули, это подстановочный знак '*', который специальный символ анализируется оболочкой, и он будет соответствовать каждому файлу, оканчивающемуся на .c, кроме специальных символов, каждый аргумент передается в исполняемый как есть.

Выход мысли

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