Что происходит, когда вы вводите `ls -l *.c` в командной консоли (под капотом)

Для начала, если вам интересно, что такое оболочка, оболочка — это интерпретатор командной строки для данной операционной системы. Он обеспечивает интерфейс между пользователем и ядром и выполняет программы, называемые командами. В этом случае, если пользователь вводит ls, оболочка выполняет команду ls. Наиболее распространенной оболочкой является оболочка Bourne-Again (bash), но другие включают оболочку Bourne (sh), оболочку Almquist (ash), KornShell (ksh) и многие другие. В этом посте я в основном буду обсуждать bash, так как он используется по умолчанию для большинства машин Linux, а ОС Linux широко используется разработчиками, поскольку она имеет открытый исходный код.

Команда ls выводит список содержимого каталога только при выполнении, но может включать флаги, как показано ниже:

ls [ОПЦИЯ]… [ФАЙЛ]..

В нашем случае мы будем использовать флаги параметров «a» и «l», определения, приведенные на справочной странице Linux, приведены ниже:

  • -a не игнорировать записи, начинающиеся с
  • -l использовать формат длинного списка

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

Поэтому, когда мы вводим команду 'ls -l с помощью клавиатуры после запроса терминала, а затем нажимаем клавишу 'Enter', оболочка читает до конца строки и сохраняет ее в строке, оканчивающейся нулевым байтовым символом ' \0'. Затем оболочка разбивает строку на массив строк, используя символ пробела в качестве разделителя.

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

Оболочка пытается сопоставить строку со встроенной функцией, типом функции, предоставляемой данной оболочкой, например, help, echo и т. д. Если совпадение выполнено, вызывается соответствующая встроенная функция, однако в этом случае мы предполагаем ls не представляет встроенный. Затем оболочка пытается сопоставить первую строку команды с любым файлом, используя переменную среды PATH. Оболочка ищет каталог /usr/local/bin, пока не найдет соответствующий исполняемый файл ls. Затем он заменяет строку соответствующим путем.

Перед запуском ls больше похож на файл, но при выполнении он становится процессом, идентифицируемым уникальным номером PID (идентификатором процесса). Процессы создаются с помощью системных вызовов или системных вызовов, в которых пользователь напрямую делает запросы к ядру.

Оболочка использует родительский и дочерний процессы для выполнения команды. Новый процесс создается, когда мы вводим нашу первоначальную команду с помощью системного вызова fork(). Затем оболочка выполняет всю команду /bin/ls -l после создания дочернего процесса с помощью системного вызова execve(), который либо возвращает ноль в случае успеха, либо ошибку в errno в противном случае.

После завершения execve() дочерний процесс завершается с помощью системного вызова exit(). Затем запускается системный вызов wait(), чтобы гарантировать завершение дочернего процесса перед возвратом к родительскому в качестве активного процесса.

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

Дополнительная литература

ls(1) — справочная страница Linux

Юникс Шелл