В разработке программного обеспечения оболочка представляет собой пользовательский интерфейс командной строки (CLI) для доступа к операционной системе. Это слой вокруг основных служб операционной системы, известный как ядро. Многие люди используют оболочки по отношению к UNIX/Linux из-за большого разнообразия доступных в них задач. Инженер-программист может программировать в нем, настраивать свою среду, запрашивать другие машины, подключаться к другим устройствам и т. д.

Мой партнер по кодированию и я провели мозговой штурм о создании собственной оболочки Linux, следуя по стопам Стивена Борна (оболочка Борна), Брайана Фокса (bash), Дэвида Корна (оболочка korn), Билла Джоя (csh), Пола Фалстада (zsh), и другие. Недавно мы более подробно изучили низкоуровневое взаимодействие оболочки Unix/Linux. Начнем с простой команды.

$ ls -l

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

Основной интерфейс начинается с приглашения $. Пользователь вводит свою команду в командной строке. Приглашение может быть простым знаком доллара или может иметь множество вариаций с помощью параметра в переменной среды $PS1. Чтобы узнать больше о $PS1, нажмите здесь.

В ответ на приглашение «$» пользователь вводит «ls -l». После нажатия клавиши возврата вы увидите результаты, которые должны напоминать пример ниже.

Что делает Шелл?

Оболочка Linux считывает команду пользователя со стандартного ввода (stdin) после считывания возвращаемого символа. Ввод анализируется или размечается с помощью разделителей, таких как [пробел], [новая строка \n], [возврат каретки \r], [табуляция \t]. Команда strtok() полезна для токенизации введенной команды.

Первый элемент или токен — это команда. Что теперь?

Является ли команда псевдонимом?

Псевдоним заменяет пользовательскую команду. Псевдонимом можно считать сокращение команды и/или ее аргументов другой строкой. В оболочках bash псевдонимы часто находятся в файле .bashrc или .bash_aliases. Если есть совпадение, введенная команда должна быть заменена определением псевдонима. Но команда может быть не готова к выполнению. Это может относиться к встроенной программе или команде в другом каталоге.

Является ли команда встроенной?

В Linux набор команд встроен в операционную систему. (см. список встроенных здесь). Если это встроенная функция, команда должна быть сопоставлена ​​с нужной функцией для запуска, а остальные аргументы могут быть переданы в качестве аргументов этой функции. Однако в нашем примере ls не является встроенной командой.

Команда находится в $PATH?

В Linux переменная среды $PATH существует в оболочке Linux. Среда наследуется от родительской оболочки. Если вы запустите «printenv» или «echo $PATH», $PATH пользователя может выглядеть как

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Чтобы найти исполняемую программу «ls», PATH должен быть обозначен знаком «:» в качестве разделителя. К каждому отдельному пути необходимо добавить «/ls» с командой fstat, чтобы проверить, существует ли команда. Каждая комбинация пути и файла проверяется до тех пор, пока не будут проверены или найдены все возможные варианты. В нашем примере команда ls находится в «/bin/ls», шестом тесте пути.

Выполнить команду с аргументами

Команда fork() создаст дочерний процесс и сделает копию стека и кучи родительского процесса. В результате дочерний процесс получит доступ к токенизированной команде «/bin/ls -l». Дочерний процесс получит большую часть той же информации о среде и программе от родителя. В дочернем проекте команда будет выполняться с помощью execve() (или другой связанной команды exec()). Команда execve() удалит процесс и заменит его своим. Он запустит команду ls и прекратит работу. Затем родитель wait() завершит дочерний процесс.

Распечатать приглашение

Затем родитель печатает приглашение (как указано в переменной среды $PS1, упомянутой выше).

Промыть и повторить

Команда обработана. Оболочка Linux теперь ожидает, пока пользователь введет другую команду.

Конец

Воткните в него вилку(). Были сделаны.