Kodomo

Пользователь

SSH и командная строка Linux

Базовые сведения о файловых системах в GNU/Linux

Файловая система – это способ организации хранения файлов на диске или другом носителе информации. Все современные файловые системы являются иерархическими. То есть существует директория (она же папка, или каталог) верхнего уровня, в которой содержатся файлы и/или вложенные директории. Каждая вложенная директория, в свою очередь, может содержать файлы и/или директории следующего уровня. Получается так называемое дерево директорий. Стоит иметь в виду, что в компьютерной среде (да и вообще в математике) деревья представляют перевернутыми, т.е. с корнем в самой верхней точке.

У каждого файла или директории есть короткое имя, являющееся уникальным в пределах родительской директории (т.е. той, непосредственно внутри которой лежит файл или папка). Цепочка коротких имен директорий, записанная через определенный разделитель по порядку вложенности, начиная с корня и заканчивая коротким именем файла или папки, называется абсолютным путем к этому файлу или папке.

В отличие от Windows, где каждая файловая система представлена логическим диском (C:, D:, и т.д.), в Linux все файловые системы объединены в общее дерево с единым корнем – корневой папкой. Корневая папка имеет короткое имя / , поэтому все абсолютные пути в Linux начинаются с символа /. В коротких именах любых других файлов или папок использовать этот символ запрещено. Он же является разделителем коротких имен при записи пути, в отличие от Windows, где используется обратный слеш \. Не путайте прямой и обратный слеш! Windows иногда позволяет использовать прямой слеш в качестве разделителя в пути (хотя это иногда приводит к удивительным багам). А в Linux обратный слеш является вполне валидным элементом короткого имени (что из этого следует догадайтесь сами).

Linux наследует от Unix конценцию "все есть файл", поэтому в файловой системе присутствуют не только обычные (regular) файлы, папки, символические ссылки (аналог ярлыков в Windows), но и специальные файлы: файлы устройств, пайпы, сокеты. Тип файла (в широком смысле) можно определить по выдаче команды ls -l, ему соответствует первый символ в первом столбце: - – обычный файл, d – директория, l – символическая ссылка и т.д. Полный список символов можно найти в описании опции -l программы ls в системе справки info.

Пользователи и процессы в Linux

Команда bash

Кроме привычного многим графического пользовательского интерфейса (GUI) существует и другой метод взаимодействия с компьютером – интерфейс командной строки (CLI). Этот метод заключается в том, что пользователь вводит текстовые команды специальной программе и получает от нее текстовые ответы. Эта программа, которая интерпретирует команды пользователя и запускает другие программы для выполнения требуемых действий, называется интерпретатором командной строки (или командной оболочной, shell). Наиболее популярным интерпретатором командной строки в Linux является программа bash.

Сразу после разбиения команды на аргументы bash проверяет их на наличие специальных символов.

В процессе интерпретации команды bash производит операции в следующем порядке:

  1. разбиение команды на аргументы;
  2. перенаправление потоков ввода/вывода;
  3. замена тильды (~);
  4. обработка масок имен файлов;
  5. удаление экранирующих символов;
  6. поиск исполнимого файла программы и её запуск.

Описана упрощенная процедура, полный список операций можно узнать в справочной странице bash.

Разбиение команды на аргументы

В первом приближении, команда bash – это строка текста. Процесс интерпретации команды начинается с разбиения команды на "слова", которые называют аргументами командной строки. В качестве разделителей аргументов выступают неэкранированные пробелы и символы табуляции. Чтобы включить эти символы в состав аргумента, их необходимо экранировать (см. ниже). Полученные после разбиения аргументы нумеруются слева направо, начиная с 0. Количество аргументов может изменяться в результате обработки файловых масок, перенаправлений потоков ввода/вывода и некоторых других операций.

Перенаправление потоков ввода вывода

Каждой запущенной программе в Linux всегда доступно три потока данных. Один из них входной, из него программа может читать байты, два – выходные, в них программа байты может записывать. Эти потоки называются стандартными потоками ввода/вывода. Каждая запущенная программа сама решает, как интерпретировать данные, доступные в стандартном потоке ввода (STDIN), и какие данные записывать в стандартный поток вывода (STDOUT) и стандартный поток вывода ошибок (STDERR). Однако, куда подключить эти потоки при старте программы решает bash на основании полученных в команде инструкций перенаправления. По-умолчанию, все три потока ввода/вывода подключены к терминалу. В этом случае в STDIN попадают символы, которые были введены в терминале после запуска программы, а содержимое STDOUT и STDERR печатается на экран в процессе работы программы.

Замена тильды

Если первым символом какого-либо аргумента является тильда (~), то все остальные символы аргумента, вплоть до следующего слеша (или конца аргумента, если он не содержит ни одного), считаются именем пользователя. Происходит замена ~username на абсолютный путь до домашней папки указанного пользователя. При этом не происходит проверки, что после замены получился путь к существующему файлу. Если пользователя username в системе не существует, то аргумент изменениям не подвергается. Пустое имя пользователя соответствует текущему пользователю. Поэтому подстановка тильды чаще всего используется, чтобы указывать адреса файлов и папок относительно своей домашней папки.

test23@kodomo:~$ echo ~test20/term1/tmp.txt
/home/students/y20/test20/term1/tmp.txt

test23@kodomo:~$ echo ~qwerty/term1/tmp.txt
~qwerty/term1/tmp.txt

test23@kodomo:~$ echo ~ ~public_html ~/term1/tmp.txt
/home/students/y23/test23 ~public_html /home/students/y23/test23/term1/tmp.txt

Обработка масок имен файлов

Удаление экранирующих символов

На данном этапе заканчивается интерпретация специальных символов bash. Все одинарные и двойные кавычки и обратные слеши (', ", \), которые сами не были экранированы, удаляются из всех аргументов.

Поиск и запуск программы

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

Интерпретация команды завершается запуском программы с передачей ей всех аргументов командной строки в виде списка строк. Что с этими данными делать дальше программа определяет сама.

HowTo/Linux (последним исправлял пользователь is_rusinov 2023-09-01 14:03:47)