ОП.05Файловая система Linuxзанятие 3Материалы

Часть 3 из 8

Где хранятся программы и как оболочка их находит

В этой части рассмотрим каталог /usr, переменную PATH, по которой оболочка ищет исполняемые файлы, и ссылки /bin, /sbin, /lib в современных дистрибутивах.

  1. 3.1 Каталог /usr
  2. 3.2 Поиск команды: переменная PATH
  3. 3.3 Ссылки /bin, /sbin и /lib

3.1 Каталог /usr

Программы, установленные менеджером пакетов, размещаются в /usr. Внутри него есть несколько подкаталогов с разным назначением. Исполняемые файлы для всех пользователей находятся в /usr/bin, программы администрирования и системные службы — в /usr/sbin, библиотеки — в /usr/lib, документация и другие общие данные — в /usr/share.

Программы, которые администратор устанавливает самостоятельно, без менеджера пакетов, принято размещать в /usr/local. Так они не смешиваются с файлами дистрибутива и не будут затронуты при его обновлении.

Пример. Если администратор скачал исходный код программы и собрал её сам, исполняемый файл кладут в /usr/local/bin. При обновлении Ubuntu менеджер пакетов этот каталог не трогает.

КаталогСодержимое
/usr/binкоманды для всех пользователей
/usr/sbinпрограммы администрирования и службы
/usr/libбиблиотеки и служебные файлы программ
/usr/shareдокументация, переводы, общие данные
/usr/localпрограммы, установленные администратором вручную

3.2 Поиск команды: переменная PATH

Чтобы запустить программу, достаточно ввести её имя, например python3, а не полный путь /usr/bin/python3. Оболочка находит исполняемый файл сама, используя переменную окружения PATH.

PATH можно сравнить со списком полок, которые вы по очереди осматриваете в поисках книги: нашли книгу на второй полке — остальные уже не проверяете. Пример. Команда python3 работает из любого каталога, потому что файл лежит в /usr/bin, а этот каталог есть в PATH. Скрипт hello.sh, созданный в домашнем каталоге, по короткому имени не запустится: домашнего каталога в PATH нет. Его запускают так: ./hello.sh.

По шагам выполнение команды выглядит так:

ШагЧто делает оболочка
1читает введённую строку и делит её на имя команды, ключи и аргументы
2проверяет, не псевдоним ли это; если да, подставляет вместо имени полную команду
3проверяет, не встроенная ли это команда; встроенную, например cd, выполняет сама
4ищет исполняемый файл по каталогам из PATH, слева направо
5запускает найденную программу и передаёт ей ключи и аргументы
6ждёт, пока программа завершится, и снова выводит приглашение

Если в имени есть косая черта, например ./app или /usr/bin/python3, поиск по PATH не нужен: оболочка сразу запускает файл по указанному пути.

В терминалеКак оболочка разрешает имена команд
  1. command -v python3# путь к найденному файлу
    что делает

    Что делает команда. Показывает, какой файл запустится при вводе python3, то есть где оболочка его нашла.

    По частям:

    command
    встроенная команда оболочки: показать, во что превращается имя команды
    -v
    вывести путь к программе или сообщить, что это встроенная команда
    python3
    имя программы python3
  2. type cd# тип команды cd
    что делает

    Что делает команда. Сообщает, чем является имя cd для оболочки: встроенной командой.

    По частям:

    type
    встроенная команда оболочки: показать, чем является имя
    cd
    имя команды cd
  3. type ls# тип команды ls
    что делает

    Что делает команда. Сообщает, чем является имя ls: в Ubuntu это псевдоним ls --color=auto.

    По частям:

    type
    встроенная команда оболочки: показать, чем является имя
    ls
    имя команды ls
  4. printf "%s\n" "$PATH" | tr : "\n"# каталоги PATH по одному в строке
    что делает

    Что делает команда. Печатает переменную PATH и заменяет двоеточия переводами строки, чтобы каждый каталог поиска был на отдельной строке.

    По частям:

    printf
    вывести текст по шаблону
    "%s\n"
    шаблон текста (\n — перевод строки; %s — место, куда подставится значение)
    "$PATH"
    значение переменной PATH
    |
    передать вывод левой команды на вход следующей
    tr
    заменить одни символы на другие
    :
    двоеточие, которым разделены каталоги PATH
    "\n"
    перевод строки: каждый каталог окажется на своей строке
  5. /usr/bin/python3 --version# запуск по полному пути
    что делает

    Что делает команда. Запускает python3 по полному пути, без поиска в PATH, и печатает его версию.

    По частям:

    /usr/bin/python3
    запустить программу python3 по полному пути, без поиска в PATH
    --version
    вывести версию программы
Результат

python3 найден в /usr/bin, cd — встроенная команда, ls — псевдоним.

Снимок 3.1Ubuntu 24.04
  1. 1файл программы python3
  2. 2встроенная команда оболочки
  3. 3псевдоним: ls выполняется с ключом --color=auto
  4. 4каталог, в котором найден python3
Разрешение имён команд и содержимое PATH.Весь снимок ↗

Разрешение имён команд и содержимое PATH.

Что показывает снимок. Оболочка показывает, чем является каждое имя: python3 — файл в /usr/bin, cd — встроенная команда, ls — псевдоним. Ниже выведен список каталогов PATH.

Где это пригодится. Если при вводе команды появляется сообщение «command not found», проверяют, установлена ли программа и есть ли её каталог в PATH. command -v показывает, какая именно программа запустится, если установлено несколько версий.

3.3 Ссылки /bin, /sbin и /lib

Исторически часть программ располагалась в /bin и /sbin, а часть — в /usr/bin и /usr/sbin. В современных дистрибутивах, в том числе в Ubuntu, все программы перенесены в /usr. Прежние каталоги /bin, /sbin и /lib сохранены в виде символических ссылок на соответствующие каталоги внутри /usr. Поэтому /bin/bash и /usr/bin/bash — один и тот же файл, а скрипты со старыми путями продолжают работать.

Пример. Многие скрипты начинаются со строки #!/bin/bash, которая указывает, какой программой выполнять скрипт. Благодаря ссылке /bin → /usr/bin такие скрипты работают, хотя сама программа bash лежит в /usr/bin.

В терминалеКуда ведут /bin, /sbin и /lib
  1. ls -ld /bin /sbin /lib# сведения о самих ссылках
    что делает

    Что делает команда. Показывает, чем являются /bin, /sbin и /lib; стрелка -> означает символическую ссылку.

    По частям:

    ls
    вывести содержимое каталога
    -l
    подробный список: права, владелец, размер, дата
    -d
    показать сам каталог, а не его содержимое
    /bin
    что показать (абсолютный путь)
    /sbin
    что показать (абсолютный путь)
    /lib
    что показать (абсолютный путь)
  2. readlink /bin# путь, записанный в ссылке
    что делает

    Что делает команда. Выводит путь, записанный внутри ссылки /bin, — usr/bin.

    По частям:

    readlink
    показать, куда указывает символическая ссылка
    /bin
    какую ссылку проверить (абсолютный путь)
  3. readlink -f /bin# полный путь, на который указывает ссылка
    что делает

    Что делает команда. Выводит полный итоговый путь, куда ведёт ссылка /bin, — /usr/bin.

    По частям:

    readlink
    показать, куда указывает символическая ссылка
    -f
    вывести полный путь цели, пройдя все ссылки
    /bin
    какую ссылку проверить (абсолютный путь)
  4. ls /usr
    что делает

    Что делает команда. Показывает подкаталоги /usr: bin, lib, share, local и другие.

    По частям:

    ls
    вывести содержимое каталога
    /usr
    что показать (абсолютный путь)
  5. ls /usr/local# программы, установленные вручную
    что делает

    Что делает команда. Показывает содержимое /usr/local, куда администратор ставит программы вручную.

    По частям:

    ls
    вывести содержимое каталога
    /usr/local
    что показать (абсолютный путь)
Результат

строки начинаются с буквы l, ссылка /bin указывает на /usr/bin.

Снимок 3.2Ubuntu 24.04
  1. 1l — символическая ссылка
  2. 2ссылка указывает на usr/bin
  3. 3полный путь цели
/bin, /lib и /sbin в Ubuntu являются ссылками на каталоги внутри /usr.Весь снимок ↗

/bin, /lib и /sbin в Ubuntu являются ссылками на каталоги внутри /usr.

Что показывает снимок. /bin, /lib и /sbin — символические ссылки на каталоги внутри /usr.

Где это пригодится. Поэтому в инструкциях встречаются и /bin/bash, и /usr/bin/bash: оба пути ведут к одному файлу, и оба будут работать.

Итоги части 3

  • Программы из пакетов хранятся в /usr, установленные вручную — в /usr/local.
  • Оболочка ищет исполняемый файл по каталогам из переменной PATH и запускает первый найденный.
  • Встроенные команды, такие как cd, выполняет сама оболочка.
  • В Ubuntu /bin, /sbin и /lib — ссылки на каталоги внутри /usr.

В отчётСнимок с command -v, type и выводом PATH.

Открыть в отдельной вкладке ↗