Выполнение программ
Запуск программ в командной строке активирует целый механизм по поиску и выполнению этой программы. Очень важно понимать, как он работает, так как проблемы с запуском вновь установленных программ возникают регулярно у всех разработчиков. Изучив материал этого урока, вы сможете решать проблемы с исполнением файлов.
Программа, независимо от того, что она делает — это всего лишь файл или набор файлов на диске. Один из этих файлов обязательно должен быть исполняемым. Помните тот самый x из урока про права доступа? Так вот, выполнить программу можно, только если она исполняемая, иначе попытка запустить ее приведет к ошибке.
Весь механизм по запуску программ в *nix-системах основан на соглашениях. Когда мы вводим некоторую команду, например, ls
, командная оболочка начинает поиск исполняемого файла с именем ls
в списке директорий, указанном в переменной окружения PATH
:
Директории друг от друга отделяются двоеточием. В этом списке присутствуют как общесистемные пути, так и специфичные пути для конкретного пользователя. В вашем случае PATH
будет другой.
Поиск программы выглядит следующим образом: командная оболочка перебирает директории слева направо и ищет директорию с файлом ls, доступным для исполнения. Если такого файла не оказалось, то выводится ошибка:
Обратите внимание, что здесь важен порядок. Если файл с одним и тем же именем находится одновременно в нескольких директориях, то в первую очередь мы найдем файл в директории, расположенной левее.
Если вам интересно узнать, а где лежит исполняемый файл конкретной программы, то можно воспользоваться командой type
(а еще which
и whereis
):
По выводу выше видно, что файл cp
принадлежит суперпользователю, но исполнять его могут все.
Скорее всего, вы заметили, что почти все пути к исполняемым файлам программ оканчиваются на директории bin. По общему соглашению исполняемые файлы в таких директориях называют бинарниками. Пакетные менеджеры знают о бинарниках и во время установки программ переносят их в одну из директорий, входящих в переменную PATH
. Для вновь устанавливаемых программ это обычно /usr/local/bin
.
Иногда возникает необходимость расширить PATH
. Особенно часто так происходит, когда мы устанавливаем программу через пакетные менеджеры языков программирования. Делать это надо осторожно — убедившись в том, что по-другому нельзя.
В некоторых ситуациях программа, которую вы хотите запустить, не лежит по путям поиска, прописанным в PATH
. Более того, она и не должна там оказаться. Представим, что исполняемый файл программы находится прямо в текущей директории. Логично предположить, что мы можем набрать имя файла и запустить его, и программа выполнится. На самом деле этого не произойдет.
Такое поведение сделано в целях безопасности: возможно, вы хотели запустить какую-то стандартную программу, а злоумышленник положил в текущую директорию вредоносную программу с таким же именем. По этой причине, прямой запуск программ всегда должен быть путем до файла — например, path/to/executable/file
. А если файл лежит в текущей директории? Здесь нам поможет обращение через точку ./
:
Разберем этот процесс пошагово:
Из домашней директории переходим в директорию
test
Находим в директории
test
исполняемый файлexecutable
, который при запуске выводит сообщениеHello from executable!
Пытаемся запустить по имени файл
executable
и получаем ошибкуПробуем запустить через точку и получаем успешный запуск
Изменение переменной PATH
В общем случае мы не рекомендуем менять переменную PATH
самостоятельно. При правильной установке большинство программ самостоятельно добавляют свои исполняемые файлы в нужные места. В некоторых случаях они просят об этом пользователя — дают подсказки, какие файлы и куда нужно добавить после установки.
Чтобы вручную изменить переменную PATH
, нужно поправить один из конфигурационных файлов Bash
. Эти файлы лежат в домашней директории пользователя и могут называться так:
.bashrc
.bash_profile
.profile
В зависимости от настроек терминала, Bash загружает либо одни файлы, либо другие. Если в вашей домашней директории есть файл .bashrc
, то попробуйте использовать его. Если нет, пробуйте остальные файлы в том порядке, в котором они приведены выше. Добавьте в этот файл следующую строку:
В этой строке вам нужно заменить /path/to/directory
на путь до директории с исполняемыми файлами. После этих манипуляций не забудьте перезапустить терминал.
Самостоятельная работа
Попробуйте узнать, где в вашей системе лежит программа tree
, установленная на одном из прошлых уроков.
Дополнительные материалы
Вопросы для самопроверки
Представим, что мы запускаем программу, которая находится одновременно в нескольких директориях, указанных в $PATH
. Из какой директории будет выполнена эта программа?
Из любой директории, выбранной случайно
Из той, что расположена правее остальных
Из той, что расположена левее
Откуда командная строка знает, где лежит исполняемый файл запускаемой программы?
Она ищет файл с таким именем во всех существующих директориях
Она ищет файл с таким именем в директориях, перечисленных в переменной окружения
PATH
Она берет список всех установленных программ из специального файла