Запуск программ в командной строке активирует целый механизм по поиску и выполнению этой программы. Очень важно понимать, как он работает, так как проблемы с запуском вновь установленных программ возникают регулярно у всех разработчиков.

Программа, независимо от того, что она делает, всего лишь файл или набор файлов на диске. Один из этих файлов обязательно должен быть исполняемым. Помните тот самый x из урока про права доступа? Так вот, выполнить программу можно только если она исполняемая, иначе попытка запустить её приведёт к ошибке.

Весь механизм по запуску программ в *nix-системах основан на соглашениях. Когда в командной строке вводится некоторая команда, например, ls, то шелл начинает поиск исполняемого файла с именем ls в списке директорий, указанном в переменной окружения PATH.

~$ echo $PATH
/home/hex/.local/bin:/home/hex/bin/:/home/hex/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Директории друг от друга отделяются двоеточием. В этом списке присутствуют как общесистемные пути, так и пути, специфичные для конкретного пользователя. В вашем случае PATH будет другой. Процесс поиска программы выглядит следующим образом. Шелл перебирает директории слева направо и ищет ту, в которой есть файл ls, доступный для исполнения. Если такого файла не оказалось, то выводится ошибка:

~$ wrongname
bash: wrongname: command not found

Подчеркну, что важен порядок. Если файл с одним и тем же именем находится одновременно в нескольких директориях, то будет найден тот, который находится в директории, расположенной левее.

Если вам интересно узнать, а где лежит исполняемый файл конкретной программы, то можно воспользоваться командой type (а ещё which и whereis):

~$ type cp
cp is /bin/cp
~$
~$ whereis cp
cp: /bin/cp
~$
~$ which cp
/bin/cp
~$
~$ ls -al /bin | grep cp
-rwxr-xr-x 1 root root  141528 Jan 18  2018 cp

По выводу выше видно, что cp принадлежит суперпользователю, но исполнять его могут все.

Обратите внимание на то, что почти все директории, в которых хранятся исполняемые файлы программ, оканчиваются на bin. Это общее соглашение, говорят "бинарники" (формально там не всегда бинарники, но это не принципиально). Пакетные менеджеры знают про эти директории и во время установки программ переносят их бинарники в одну из директорий, входящих в PATH. Для вновь устанавливаемых программ обычно это /usr/local/bin. Иногда возникает необходимость расширить PATH, особенно в случае установки через пакетные менеджеры языков программирования, но делать это надо осторожно, убедившись в том, что по-другому нельзя.

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

Такое поведение сделано в целях безопасности. Ведь возможно вы хотели запустить какую-то стандартную программу, а злоумышленник положил в текущую директорию программу с таким же именем, но делающую что-то плохое. По этой причине, прямой запуск программ всегда должен быть путём до файла, например path/to/executable/file. А если файл лежит в текущей директории? Вот тут-то нам и поможет обращение через точку ./:

~$ pwd
/home/hex
~$ cd test/
~/test$ ls -al
total 16
drwxr-xr-x 2 hex hex 4096 Sep 10 15:24 .
drwxr-xr-x 1 hex hex 4096 Sep 10 15:24 ..
-rwxr-xr-x 1 hex hex   60 Sep 10 15:24 executable
~/test$ executable
bash: executable: command not found
~/test$ ./executable
Hello from executable!
~/test$
  1. Из домашней директории переходим в каталог test.
  2. В нём лежит исполняемый файл executable, который при запуске выводит сообщение Hello from executable!
  3. Попытка запустить по имени: executable заканчивается ошибкой
  4. Запуск через точку происходит успешно

Изменение переменной PATH

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

Для ручного изменения переменной PATH нужно поправить один из конфигурационных файлов Bash. Эти файлы лежат в домашней директории пользователя:

  • .bashrc
  • .bash_profile
  • .profile

В зависимости от настроек терминала, Bash прогружает либо одни файлы либо другие. Если в вашей домашней директории есть файл .bashrc то пробуйте использовать его, если нет то остальные файлы в том порядке, в котором они приведены выше. Добавьте в этот файл следующую строку:

export PATH=$PATH:/path/to/directory

Где /path/to/directory путь до директории с исполняемыми файлами.

После этих манипуляций не забудьте перезапустить терминал.

Самостоятельная работа

  • Попробуйте узнать, где в вашей системе лежит установленная на одном из прошлых уроков программа tree
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →