Выполнение программ | PATH
Компьютерная программа — это последовательность инструкций, которые компьютер будет исполнять. Иногда под программой понимают исходный код этой программы. Когда пользователь компьютера запускает программу, он создаёт т.н. процесс, который соответствует этой программе.
Запуск программ
Запуск программ в командной строке активирует целый механизм по поиску и выполнению этой программы. Программа - это всего лишь файл или набор файлов на диске. Один из этих файлов обязательно должен быть исполняемым (тот самый ' x ' делает файл исполнимым и позволяет выполнить программу).
Весь механизм по запуску программ в *nix-системах основан на соглашениях. Когда в командной строке вводится некоторая команда, например, ls, то шелл начинает поиск исполняемого файла с именем ls в списке директорий, указанном в переменной окружения PATH:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Директории друг от друга отделяются двоеточием. В этом списке присутствуют как общесистемные пути, так и пути, специфичные для конкретного пользователя. Процесс поиска программы выглядит следующим образом: shell перебирает директории слева направо и ищет ту, в которой есть файл ls, доступный для исполнения. Если такого файла не оказалось, то выводится ошибка:
$ supergit
supergit: команда не найдена
Здесь важен порядок. Если файл с одним и тем же именем находится одновременно в нескольких директориях, то будет найден тот, который находится в директории, расположенной левее.
Если вам интересно узнать, а где лежит исполняемый файл конкретной программы, то можно воспользоваться командой type:
$ type safeeyes
safeeyes является /usr/bin/safeeyes
PATH
Почти все директории, в которых хранятся исполняемые файлы программ, оканчиваются на bin. Это общее соглашение, говорят "бинарники" (формально там не всегда бинарники). Пакетные менеджеры знают про эти директории и во время установки программ переносят их бинарники в одну из директорий, входящих в PATH. Для вновь устанавливаемых программ обычно это /usr/local/bin.
Иногда возникает необходимость расширить PATH, особенно в случае установки через пакетные менеджеры языков программирования, но делать это надо осторожно, убедившись в том, что по-другому нельзя.
В некоторых ситуациях программа, которую вы хотите запустить, не лежит по путям поиска (прописанным в PATH) и не должна там оказаться. Если её исполняемый файл находится прямо в текущей директории, то логично предположить, что если набрать имя файла и запустить его, то программа выполнится. На самом деле этого не произойдёт!
Такое поведение сделано в целях безопасности. Ведь возможно вы хотели запустить какую-то стандартную программу, а злоумышленник положил в текущую директорию программу с таким же именем, но делающую что-то плохое. По этой причине, прямой запуск программ всегда должен быть путём до файла, например path/to/executable/file. А если файл лежит в текущей директории - тогда обращение через точку ' ./ '.
Для ручного изменения переменной PATH нужно поправить один из конфигурационных файлов Bash. Эти файлы лежат в домашней директории пользователя:
* .bashrc
* .bash_profile
* .profile
В зависимости от настроек терминала, Bash прогружает либо одни файлы, либо другие. Если в вашей домашней директории есть файл .bashrc, то пробуйте использовать его, если нет, то остальные файлы в том порядке, в котором они приведены выше.
Файловая система *nix-систем
Файловая структура представляет собой дерево, в узлах которого находятся директории (файлы специального типа), а в листьях — файлы. В *nix-системах — единственное дерево с корнем в /. Все устройства, физические и логические диски находятся внутри этого дерева в виде директорий и файлов.
Говорят, что в *nix "всё есть файл". Понятие "папка" в *nix-системах не используется, говорят "директория" или "каталог". Директория — это специальный файл, который содержит список файлов. Любое подключаемое устройство становится файлом или директорией, если это накопитель. Такая концепция довольно удобна для разработчиков, потому что печать на принтер и вывод на экран между собой ничем не отличаются — для кода это просто "запись в файл". На пользовательском уровне директория всё же отличается от файла и имеет собственные команды для создания, удаления и модификации.
В *nix-системах есть базовый набор каталогов, который стандартизирован FHS. За каждым закреплена какая-то особая роль. Не во все директории можно заходить, не все файлы можно читать или менять, и не все программы можно запускать.
В *nix-системах регистр имеет значение. Файлы index.html, IndEx.html и index.HTML — это разные файлы. Всегда обращайте внимание на регистр, потому что ошибиться довольно легко. В отличие от Windows, в *nix-системах отсутствует понятие "расширение файла". Точка — полноправная часть имени. Например "disco.mp3", вся эта строчка — имя файла. В *nix также есть скрытые файлы, но, в отличие от Windows, это не свойство файла, а определённое имя файла. Все файлы и директории, начинающиеся с точки, считаются скрытыми. Есть также две особые директории, обозначенные "точкой" ' . ' и "двумя точками" ' .. '. Точка означает текущую директорию, а две точки — директорию верхнего уровня.
Кроме обычных файлов, в *nix существует ряд других:
- Hard Link — дополнительное имя для уже существующего файла.
- Symbolic link — символическая ссылка, такой файл похож на ярлык в Windows. Если удалить основной файл, то символическая ссылка начнёт вести в никуда.
- Socket — специальный файл, через который происходит взаимодействие между разными процессами операционной системы. Программисты постоянно сталкиваются с сокетами в реальной жизни.