Что такое подсказка оболочки
Это приглашение оболочки, и на самом деле это информация, хранящаяся в переменной среды $PS1 с использованием формата для анализа, например, это моя $PS1:
Получение линии
Первое, что сделает любая оболочка, — это чтение из стандартного ввода, будь то через терминал или конвейер, оболочка должна прочитать строку или несколько из стандартного ввода, каждая строка заканчивается символом новой строки «\n».
Жемчужина оболочки: разбор
На снимке экрана мы видим, что оболочка разбивает строку на несколько токенов, первый из которых является программой/командой, которую необходимо выполнить, а остальные являются ее аргументом, который ведет нас к следующему шагу.
Фактическая работа: тестирование и выполнение
Правильный путь
Существует три типа команд: встроенная команда, такая как cd или exit, полный исполняемый файл или программа, расположенная в одном из каталогов в PATH.
Если это встроенная команда, она передаст аргументы системному вызову, будь то chdir (изменение каталога) или выход.
Иначе, если это псевдоним, мы преобразуем псевдоним и выполняем его с нижеприведенными проверками.
если это абсолютный путь к исполняемому файлу, программа разветвится, создав дочерний процесс, а затем выполнит программу с переменной среды родительского процесса.
Иначе, еслимы проверим его и соединим имя программы с каталогами внутри переменной окружения PATH, и если файл будет найден, произойдет разветвление — выполнение процедуры.
Иначе ни один из них не напечатает, что он не найден.
Исполнение
Давайте углубимся в выполнение программы:
- Мы разветвляем основной процесс, создавая дочерний процесс, используя системный вызов fork(), наследующий родительскую переменную среды.
- После разветвления мы проверяем, находимся ли мы в дочернем процессе, и выполняем команду, используя системный вызов execve(), давая ему программу для выполнения массива аргументов с исполняемым файлом в качестве первого элемента и средой, подобной execve(arg_array[0], arg_array, окружающая среда).
- Пока дочерний процесс выполняет программу, родительский процесс должен ожидать ее, используя системный вызов wait(), который сохраняет в своем аргументе статус дочернего процесса.
Аргументы сложны
ls -l *.c
В нашем примере команды есть часть, которую мы не упомянули, это подстановочный знак '*', который специальный символ анализируется оболочкой, и он будет соответствовать каждому файлу, оканчивающемуся на .c, кроме специальных символов, каждый аргумент передается в исполняемый как есть.
Выход мысли
Современные оболочки сами по себе являются полноценными языками и бесконечно полезны во многих областях, от простых сценариев до управления центрами обработки данных. Этот проект был невероятно поучительным, потому что я узнал о каждой части этого невероятного программного обеспечения.