Education 1.1 Help

Выполнение программ

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

Программа, независимо от того, что она делает — это всего лишь файл или набор файлов на диске. Один из этих файлов обязательно должен быть исполняемым. Помните тот самый 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

asciinema

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

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

wrongname bash: wrongname: command not found

asciinema

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

Если вам интересно узнать, а где лежит исполняемый файл конкретной программы, то можно воспользоваться командой 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

asciinema

По выводу выше видно, что файл 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!

asciinema

Разберем этот процесс пошагово:

  • Из домашней директории переходим в директорию 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, установленная на одном из прошлых уроков.

Дополнительные материалы

  1. Перечень наиболее часто используемых команд

  2. Как использовать коды завершения в Bash-скриптах

  3. Как создать псевдоним для команд в Bash

Вопросы для самопроверки

Представим, что мы запускаем программу, которая находится одновременно в нескольких директориях, указанных в $PATH. Из какой директории будет выполнена эта программа?

  • Из любой директории, выбранной случайно

  • Из той, что расположена правее остальных

  • Из той, что расположена левее

Откуда командная строка знает, где лежит исполняемый файл запускаемой программы?

  • Она ищет файл с таким именем во всех существующих директориях

  • Она ищет файл с таким именем в директориях, перечисленных в переменной окружения PATH

  • Она берет список всех установленных программ из специального файла

Last modified: 12 June 2024