HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Запуск программ в командной строке активирует целый механизм по поиску и выполнению этой программы. Очень важно понимать, как он работает, так как проблемы с запуском вновь установленных программ возникают регулярно у всех разработчиков. Изучив материал этого урока, вы сможете решать проблемы с исполнением файлов.</p>
1 <p>Запуск программ в командной строке активирует целый механизм по поиску и выполнению этой программы. Очень важно понимать, как он работает, так как проблемы с запуском вновь установленных программ возникают регулярно у всех разработчиков. Изучив материал этого урока, вы сможете решать проблемы с исполнением файлов.</p>
2 <p>Программа, независимо от того, что она делает - это<strong>всего лишь файл или набор файлов на диске</strong>. Один из этих файлов обязательно должен быть<strong>исполняемым</strong>. Помните тот самый x из урока про права доступа? Так вот, выполнить программу можно, только если она исполняемая, иначе попытка запустить ее приведет к ошибке.</p>
2 <p>Программа, независимо от того, что она делает - это<strong>всего лишь файл или набор файлов на диске</strong>. Один из этих файлов обязательно должен быть<strong>исполняемым</strong>. Помните тот самый x из урока про права доступа? Так вот, выполнить программу можно, только если она исполняемая, иначе попытка запустить ее приведет к ошибке.</p>
3 <p>Весь механизм по запуску программ в *nix-системах основан на<strong>соглашениях</strong>. Когда мы вводим некоторую команду, например, ls, командная оболочка начинает поиск исполняемого файла с именем ls в списке директорий, указанном в переменной окружения PATH:</p>
3 <p>Весь механизм по запуску программ в *nix-системах основан на<strong>соглашениях</strong>. Когда мы вводим некоторую команду, например, ls, командная оболочка начинает поиск исполняемого файла с именем ls в списке директорий, указанном в переменной окружения PATH:</p>
4 <p>Директории друг от друга отделяются двоеточием. В этом списке присутствуют как общесистемные пути, так и специфичные пути для конкретного пользователя. В вашем случае PATH будет другой.</p>
4 <p>Директории друг от друга отделяются двоеточием. В этом списке присутствуют как общесистемные пути, так и специфичные пути для конкретного пользователя. В вашем случае PATH будет другой.</p>
5 <p>Поиск программы выглядит следующим образом: командная оболочка перебирает директории слева направо и ищет директорию с файлом ls, доступным для исполнения. Если такого файла не оказалось, то выводится ошибка:</p>
5 <p>Поиск программы выглядит следующим образом: командная оболочка перебирает директории слева направо и ищет директорию с файлом ls, доступным для исполнения. Если такого файла не оказалось, то выводится ошибка:</p>
6 <p>Обратите внимание, что здесь важен порядок. Если файл с одним и тем же именем находится одновременно в нескольких директориях, то в первую очередь мы найдем файл в директории, расположенной левее.</p>
6 <p>Обратите внимание, что здесь важен порядок. Если файл с одним и тем же именем находится одновременно в нескольких директориях, то в первую очередь мы найдем файл в директории, расположенной левее.</p>
7 <p>Если вам интересно узнать, а где лежит исполняемый файл конкретной программы, то можно воспользоваться командой type (а еще which и whereis):</p>
7 <p>Если вам интересно узнать, а где лежит исполняемый файл конкретной программы, то можно воспользоваться командой type (а еще which и whereis):</p>
8 <p>По выводу выше видно, что файл<em>cp</em>принадлежит суперпользователю, но исполнять его могут все.</p>
8 <p>По выводу выше видно, что файл<em>cp</em>принадлежит суперпользователю, но исполнять его могут все.</p>
9 <p>Скорее всего, вы заметили, что почти все пути к исполняемым файлам программ оканчиваются на директории<em>bin</em>. По общему соглашению исполняемые файлы в таких директориях называют<strong>бинарниками</strong>. Пакетные менеджеры знают о бинарниках и во время установки программ переносят их в одну из директорий, входящих в переменную PATH. Для вновь устанавливаемых программ это обычно<em>/usr/local/bin</em>.</p>
9 <p>Скорее всего, вы заметили, что почти все пути к исполняемым файлам программ оканчиваются на директории<em>bin</em>. По общему соглашению исполняемые файлы в таких директориях называют<strong>бинарниками</strong>. Пакетные менеджеры знают о бинарниках и во время установки программ переносят их в одну из директорий, входящих в переменную PATH. Для вновь устанавливаемых программ это обычно<em>/usr/local/bin</em>.</p>
10 <p>Иногда возникает необходимость расширить PATH. Особенно часто так происходит, когда мы устанавливаем программу через пакетные менеджеры языков программирования. Делать это надо осторожно - убедившись в том, что по-другому нельзя.</p>
10 <p>Иногда возникает необходимость расширить PATH. Особенно часто так происходит, когда мы устанавливаем программу через пакетные менеджеры языков программирования. Делать это надо осторожно - убедившись в том, что по-другому нельзя.</p>
11 <p>В некоторых ситуациях программа, которую вы хотите запустить, не лежит по путям поиска, прописанным в PATH. Более того, она и не должна там оказаться. Представим, что исполняемый файл программы находится прямо в текущей директории. Логично предположить, что мы можем набрать имя файла и запустить его, и программа выполнится. На самом деле этого не произойдет.</p>
11 <p>В некоторых ситуациях программа, которую вы хотите запустить, не лежит по путям поиска, прописанным в PATH. Более того, она и не должна там оказаться. Представим, что исполняемый файл программы находится прямо в текущей директории. Логично предположить, что мы можем набрать имя файла и запустить его, и программа выполнится. На самом деле этого не произойдет.</p>
12 <p>Такое поведение сделано в целях безопасности: возможно, вы хотели запустить какую-то стандартную программу, а злоумышленник положил в текущую директорию вредоносную программу с таким же именем. По этой причине, прямой запуск программ всегда должен быть путем до файла - например,<em>path/to/executable/file</em>. А если файл лежит в текущей директории? Здесь нам поможет обращение через точку ./:</p>
12 <p>Такое поведение сделано в целях безопасности: возможно, вы хотели запустить какую-то стандартную программу, а злоумышленник положил в текущую директорию вредоносную программу с таким же именем. По этой причине, прямой запуск программ всегда должен быть путем до файла - например,<em>path/to/executable/file</em>. А если файл лежит в текущей директории? Здесь нам поможет обращение через точку ./:</p>
13 <p>Разберем этот процесс по шагам:</p>
13 <p>Разберем этот процесс по шагам:</p>
14 <ol><li>Из домашней директории переходим в директорию<em>test</em>.</li>
14 <ol><li>Из домашней директории переходим в директорию<em>test</em>.</li>
15 <li>Находим в директории<em>test</em>исполняемый файл<em>executable</em>, который при запуске выводит сообщение Hello from executable!.</li>
15 <li>Находим в директории<em>test</em>исполняемый файл<em>executable</em>, который при запуске выводит сообщение Hello from executable!.</li>
16 <li>Пытаемся запустить по имени файл<em>executable</em>и получаем ошибку.</li>
16 <li>Пытаемся запустить по имени файл<em>executable</em>и получаем ошибку.</li>
17 <li>Пробуем запустить через точку и получаем успешный запуск.</li>
17 <li>Пробуем запустить через точку и получаем успешный запуск.</li>
18 </ol><h2>Изменение переменной PATH</h2>
18 </ol><h2>Изменение переменной PATH</h2>
19 <p>В общем случае мы не рекомендуем менять переменную PATH самостоятельно. При правильной установке большинство программ самостоятельно добавляют свои исполняемые файлы в нужные места. В некоторых случаях они просят об этом пользователя - дают подсказки, какие файлы и куда нужно добавить после установки.</p>
19 <p>В общем случае мы не рекомендуем менять переменную PATH самостоятельно. При правильной установке большинство программ самостоятельно добавляют свои исполняемые файлы в нужные места. В некоторых случаях они просят об этом пользователя - дают подсказки, какие файлы и куда нужно добавить после установки.</p>
20 <p>Чтобы вручную изменить переменную PATH, нужно поправить один из конфигурационных файлов Bash. Эти файлы лежат в домашней директории пользователя и могут называться так:</p>
20 <p>Чтобы вручную изменить переменную PATH, нужно поправить один из конфигурационных файлов Bash. Эти файлы лежат в домашней директории пользователя и могут называться так:</p>
21 <ul><li><em>.bashrc</em>.</li>
21 <ul><li><em>.bashrc</em>.</li>
22 <li><em>.bash_profile</em>.</li>
22 <li><em>.bash_profile</em>.</li>
23 <li><em>.profile</em>.</li>
23 <li><em>.profile</em>.</li>
24 </ul><p>В зависимости от настроек терминала, Bash загружает либо одни файлы, либо другие. Если в вашей домашней директории есть файл<em>.bashrc</em>, то попробуйте использовать его. Если нет, пробуйте остальные файлы в том порядке, в котором они приведены выше. Добавьте в этот файл следующую строку:</p>
24 </ul><p>В зависимости от настроек терминала, Bash загружает либо одни файлы, либо другие. Если в вашей домашней директории есть файл<em>.bashrc</em>, то попробуйте использовать его. Если нет, пробуйте остальные файлы в том порядке, в котором они приведены выше. Добавьте в этот файл следующую строку:</p>
25 <p>В этой строке вам нужно заменить<em>/path/to/directory</em>на путь до директории с исполняемыми файлами. После этих манипуляций не забудьте перезапустить терминал.</p>
25 <p>В этой строке вам нужно заменить<em>/path/to/directory</em>на путь до директории с исполняемыми файлами. После этих манипуляций не забудьте перезапустить терминал.</p>
26 <p>Если вы используете оболочку Zsh (например, на MacOS), то вместо<em>.bashrc</em>используется файл<em>.zshrc</em>. Чтобы изменить значение переменной PATH в Zsh, откройте файл<em>~/.zshrc</em>и добавьте ту же самую строку</p>
26 <p>Если вы используете оболочку Zsh (например, на MacOS), то вместо<em>.bashrc</em>используется файл<em>.zshrc</em>. Чтобы изменить значение переменной PATH в Zsh, откройте файл<em>~/.zshrc</em>и добавьте ту же самую строку</p>