Что происходит, когда вы вводите ls *.c в оболочке?

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

Чтобы получить доступ к оболочке, можно просто открыть терминал на компьютере. Теперь попробуйте ввести просто ls и нажмите Enter. Что ты видишь?

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

Есть три места, где оболочка выполняет поиск: псевдонимы, встроенные функции и PATH, именно в таком порядке. Псевдонимы — это команды, созданные и измененные пользователем. Например, пользователь может изменить команду ls таким образом, чтобы при вводе ls оболочка не только отображала список файлов, но и список всех скрытых файлов в длинном формате (псевдоним ls="ls -la"). Встроенные функции — это команды, которые оболочка может выполнять напрямую, не обращаясь к ядру. Такие команды, как cd, pwd и echo, являются примерами встроенных функций оболочки. Наконец, PATH — это переменная, содержащая список каталогов, в которых хранятся остальные команды. На изображении ниже показан пример того, какие каталоги включены в переменную PATH:

Каждый из каталогов отделяется двоеточием. В этом примере переменная PATH содержит 8 каталогов. Также можно изменить содержимое PATH, установив локальную или глобальную переменную. Локальные переменные доступны для использования в следующей строке команды в оболочке, тогда как глобальные переменные доступны на протяжении всего текущего сеанса оболочки. Если пользователь хочет использовать переменные, которые он устанавливает для будущих сеансов оболочки, ему придется внести изменения в каталог ~/.bashrc, что выходит за рамки этого поста.

Вернемся к команде ls — в данном случае команда ls находится в PATH. Как только команда ls найдена, оболочка может сообщить компьютеру о ее выполнении, что приведет к отображению списка файлов и каталогов на терминале. Если команда ls не найдена в каталогах в PATH, оболочка отобразит сообщение об ошибке. Поскольку локальные переменные, глобальные переменные и другие переменные, такие как PATH, играют роль в формировании среды оболочки и настроек для пользователя, их также называют переменными среды. Чтобы отличать переменные, сохраненные в среде оболочки (например, PATH, HOME), от созданных пользователем (локальные и глобальные переменные), мы также называем их зарезервированными переменными.

Остается последняя часть загадки: а как насчет *.c? Попробуйте ввести в терминал полную команду ls *.c и посмотрите, что отображается в терминале. Вы замечаете закономерность?

Похоже, что все отображаемые файлы и каталоги имеют одинаковое окончание: «.c». Откуда компьютер это знает?

Вспомните нашу аналогию с пением. Предположим, вы хотите, чтобы компьютер пел определенную песню или песни определенного жанра. Вы можете сделать это, сообщив компьютеру конкретное название песни, например, «пойте с днем ​​рождения» или более общую категорию «пойте рок-н-ролл». Часть *.c служит той же цели — она сообщает компьютеру, какие файлы и каталоги должны отображаться. Когда оболочка читает *.c, она интерпретирует его как все элементы (файлы и каталоги) в текущем каталоге, имена которых заканчиваются на «.c». * — это то, что известно как подстановочный знак: он представляет собой любую комбинацию символов, которые в данном случае предшествуют «.c». По этой причине отображается файл programming_is_fun.c, где * представляет часть имени файла programming_is_fun, а файл debugging.txt не является.

Вот и все! Тайна ls *.c раскрыта. Чтобы узнать больше о программировании и моем пути к тому, чтобы стать инженером-программистом, подпишитесь на меня на Medium.