Запуск программ в командной строке активирует целый механизм по поиску и выполнению этой программы. Очень важно понимать, как он работает, так как проблемы с запуском вновь установленных программ возникают регулярно у всех разработчиков. Изучив материал этого урока, вы сможете решать проблемы с исполнением файлов.
Программа, независимо от того, что она делает — это всего лишь файл или набор файлов на диске. Один из этих файлов обязательно должен быть исполняемым. Помните тот самый 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 /usr/share/man/man1/cp.1
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/
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
executable
bash: executable: command not found
./executable
Hello from executable!
Разберем этот процесс по шагам:
- Из домашней директории переходим в директорию test.
- Находим в директории test исполняемый файл executable, который при запуске выводит сообщение
Hello from executable!
. - Пытаемся запустить по имени файл executable и получаем ошибку.
- Пробуем запустить через точку и получаем успешный запуск.
Изменение переменной PATH
В общем случае мы не рекомендуем менять переменную PATH
самостоятельно. При правильной установке большинство программ самостоятельно добавляют свои исполняемые файлы в нужные места. В некоторых случаях они просят об этом пользователя — дают подсказки, какие файлы и куда нужно добавить после установки.
Чтобы вручную изменить переменную PATH
, нужно поправить один из конфигурационных файлов Bash. Эти файлы лежат в домашней директории пользователя и могут называться так:
- .bashrc.
- .bash_profile.
- .profile.
В зависимости от настроек терминала, Bash загружает либо одни файлы, либо другие. Если в вашей домашней директории есть файл .bashrc, то попробуйте использовать его. Если нет, пробуйте остальные файлы в том порядке, в котором они приведены выше. Добавьте в этот файл следующую строку:
export PATH=$PATH:/path/to/directory
В этой строке вам нужно заменить /path/to/directory на путь до директории с исполняемыми файлами. После этих манипуляций не забудьте перезапустить терминал.
Самостоятельная работа
Попробуйте узнать, где в вашей системе лежит программа tree
, установленная на одном из прошлых уроков.
Дополнительные материалы
- Перечень наиболее часто используемых команд
- Как использовать коды завершения в Bash-скриптах
- Как создать псевдоним для команд в Bash
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»