Как работает path linux

Как работает path linux

Версия 0.4, 15 Ноября 1997

Этот документ описывает общие проблемы с переменными окружения Unix / Linux, особенно с переменной PATH. Переменная PATH содержит список каталогов, в которых производится поиск команд. Применимо для дистрибутива Debian Linux 1.3.

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

This documentation is free documentation; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This documentation is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this documentation; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

Авторские права на русский перевод этого текста принадлежат © 2000 SWSoft Pte Ltd. Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

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

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

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: > или к координатору русского перевода Linux HOWTO компании SWSoft Pte Ltd. по адресу >

Все процессы в Unix содержат «окружение» (environment). Это список переменных, которые содержат имена и значения, они являются строками и могут содержать большинство символов. Все процессы в Unix имеют родительский процесс — просесс созданный этим процессом называется дочерним. Дочерние процессы наследуют окружение от родительского процесса. Они могут делать некоторые изменения в окружении перед принятием окружения уже их дочерними процессами.

Одна важная переменная окружения — PATH (ПУТЬ), список каталогов, разделенных двоеточием (‘:’). Эти каталоги просматриваются, чтобы найти команды. Если вы пробуете вызвать команду ‘foo’, все каталоги из переменной PATH (в указаном порядке) будут просмотрены для выполнения файла ‘foo’ (с установленными правами на выполнение). Если файл найден, он исполняется.

В этом документе я использую термин ‘команда’, к которому отношу программы, которые, как предполагается, имеют короткое имя, используя механизм путей.

В Linux для запуска процесса операционная система просматривает каталоги, записанные в переменной PATH: вы можете использовать механизм путей там, где пробуете выполнить команду. Если операционная система получает имя файла, котрый не содержит ‘/’ то просматриваются каталоги из переменной окружения PATH. Даже если в среде не имеется никакой переменной PATH, по крайней мере, каталоги /bin и /usr/bin будут просматриваться.

В sh вы используете команду export, чтобы установить окружение, в csh используйте команду setenv. Например:

setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:.

C-программы могут использовать библиотечную функцию setenv() для изменения окружения. Perl содержит окружение в ассоциативном массиве %ENV, вы можете установить PATH так $ENV=»/bin».

Команда env — основной путь выяснения текущих переменных окружения. Она может использоваться также, чтобы изменить их.

Более исчерпывающую информацию по основам механизма окружения можно взять из страниц руководства (man) ‘environ’, ‘execl’, ‘setenv’, или info ‘env’ и из документации по вашей оболочке.

Когда Linux загружается, первый процесс, который запускается является init. Это — специальный процесс, потому что не имеет родителя. Однако он первичный для всех процессов. Окружение init останется окружением всех процессов, если он не касаются окружения явно. Большинство процессов изменяют окружение.

Читайте также:  Epson stylus sx235w драйвер для windows 10

Init запускает группу процессов. Файл /etc/inittab сообщает то, какие процессы система запускает. Эти процессы работают в окружении, прямо унаследованом от init — например программа ‘getty’ пишет ‘login:’ на консоль. Если вы запускаете соединение PPP, вы должны помнить, что вы работаете в окружении init. Инициализация системы — это часто сценарий, который запускается отсюда. В Debian 1.3 скрипт инициализации /etc/init.d/rc вызывает, в свою очередь, другие сценарии инициализации.

Система содержит много запускаемых серверов (демоны), которые могут использовать или не использовать окружение, установленное по умолчанию. Большинство серверов запускается из сценария инициализации, и, таким образом, имеют окружение от init.

Когда пользователь заходит в систему, на среду действуют назначения, которые записаны в программу при компиляции, в системный скрипт инициализации и в пользовательский скрипт инициализации. Это довольно усложнено, и текущая ситуация не полностью удовлетворительна. Процесс различается, если пользователь заходит из консоли, XDM или из сети.

Init — родительский процесс для всех остальных процессов системы. Другие процессы наследуют окружение процесса init и пути, прописанные в init. Только в редких случаях другие пути не установлены.

‘Пути init’ зафиксированы в исходниках программы и они выглядят так:

Заметьте, что пути init не содержат /usr/local/bin.

Все программы, которые запускаются из /etc/inittab работают в окружении init, особенно системные скрипты инициализации из /etc/init.d (Debian 1.3).

Все, что запускается из системных сценариев инициализации, имеет окружение init, как окружение по умолчанию. Например, syslogd, kerneld, pppd (когда стартует при запуске), gpm, lpd и inetd имеют окружение init, и не изменяют его.

Группа программ стартует из загрузочного скрипта, и PATH явно установлена в этом скрипте. Например: atd, sendmail, apache и squid.

Имеются другие программы, которые стартуют из сценариев начальной загрузки, но они заменяют путь полностью. Один такой пример — cron.

В текстовой консоли имеется программа getty, ожидающая вход в систему пользователя. Она пишет ‘login:’ и другие сообщения. Работает в окружении init. Когда пользователь входит в систему, getty вызывает программу ‘login’. Эта программа устанавливает пользовательское окружение и вызывает оболочку.

Программа Login устанавливает пути, определенные в /usr/include/paths.h. ‘Пути login’ различны для root и других пользователей.

для обычных пользователей (_PATH_DEFPATH):

для root (_PATH_DEFPATH_ROOT):

Пути обычных пользователей не содержат пути, содержащие любые sbin каталоги. Однако, они содержат текущий каталог, ‘.’, который считается опасным для пользователя root. Даже /usr/local/bin не указан для root.

Пути Login часто переписываются скриптом инициализации оболочки. Однако, возможно использовать другие программы, записанные в /etc/passwd как оболочки пользователя. Например, я использовал следующую строку, чтобы запускался PPP, когда я вхожу в систему, используя специальное имя пользователя. В этом случае, pppd имеет точный путь входа в систему.

etu-ppp:viYabVlxPwzDl:1000:1000:Esa Turtiainen, PPP:/:/usr/sbin/pppd

Часто пользовательские процессы — дочерние процессы оболочки записаны в /etc/passwd для этого пользователя. Файлы инициализации оболочек часто изменяют пути.

В login, названию оболочки предшествует ‘-‘, для bash например, написано ‘-bash’. Это сигнал системе, что оболочка запускается при входе в систему. В этом случае, оболочка выполняет инициализационные файлы при входе в оболочку. Иначе происходит более легкая инициализация. Дополнительно оболочка проверяет — являются ли команды исходящими из файла или набираемыми на терминале. Это модифицирует инициализацию оболочки так, что неинтерактивная оболочка инициализируется совсем слегка, bash, в этом случае, не выполняет никакой инициализации.

Как нормальная оболочка, bash просматривает общесистемный файл /etc/profile, где описано системное окружение и пути, которые могут быть установлены для пользователей bash. Однако, это не выполняется, когда система интерпретирует оболочку как не-интерактивную. Наиболее важный случай находится в rsh, когда удаленная команда выполняется на соседней машине. /etc/profile не запускается, и пути наследуются от rsh демона.

bash получает аргументы командной строки -login и -i, которые могут быть использованы, чтобы установить оболочку, как оболочку для входа или как интерактивную.

Пользователь может переписать значения, установленные в /etc/profile путем создания файлов

/.profile. Обратите внимание, что только самый первый из них выполняется — отличается от логики инициализации csh.

/.bash_login не выполняется специально для оболочки входа в систему и если .bash_profile существует, он не выполняется вообще.

Если bash используется с именем sh вместо имени bash, он эмулирует инициализацию bash: ищет файлы /etc/profile и

/.profile только для входных оболочек.

Читайте также:  Linux find the operating system

При входе оболочка tcsh исполняет следующие файлы в данной последовательности:

Источник

PATH HOWTO

Esa Turtiainen

Перевод: Александр Ермолаев, SWSoft Pte Ltd.

Версия 0.4, 15 Ноября 1997

1. Введение

Этот документ описывает общие проблемы с переменными окружения Unix / Linux, особенно с переменной PATH. Переменная PATH содержит список каталогов, в которых производится поиск команд. Применимо для дистрибутива Debian Linux 1.3.

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

This documentation is free documentation; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This documentation is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this documentation; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

3. Авторские права

Авторские права на русский перевод этого текста принадлежат © 2000 SWSoft Pte Ltd. Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

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

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

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: или к координатору русского перевода Linux HOWTO компании SWSoft Pte Ltd. по адресу

4. Общие принципы

Все процессы в Unix содержат «окружение» (environment). Это список переменных, которые содержат имена и значения, они являются строками и могут содержать большинство символов. Все процессы в Unix имеют родительский процесс — просесс созданный этим процессом называется дочерним. Дочерние процессы наследуют окружение от родительского процесса. Они могут делать некоторые изменения в окружении перед принятием окружения уже их дочерними процессами.

Одна важная переменная окружения — PATH (ПУТЬ), список каталогов, разделенных двоеточием (‘:’). Эти каталоги просматриваются, чтобы найти команды. Если вы пробуете вызвать команду ‘foo’, все каталоги из переменной PATH (в указаном порядке) будут просмотрены для выполнения файла ‘foo’ (с установленными правами на выполнение). Если файл найден, он исполняется.

В этом документе я использую термин ‘команда’, к которому отношу программы, которые, как предполагается, имеют короткое имя, используя механизм путей.

В Linux для запуска процесса операционная система просматривает каталоги, записанные в переменной PATH: вы можете использовать механизм путей там, где пробуете выполнить команду. Если операционная система получает имя файла, котрый не содержит ‘/’ то просматриваются каталоги из переменной окружения PATH. Даже если в среде не имеется никакой переменной PATH, по крайней мере, каталоги /bin и /usr/bin будут просматриваться.

В sh вы используете команду export, чтобы установить окружение, в csh используйте команду setenv. Например:

C-программы могут использовать библиотечную функцию setenv() для изменения окружения. Perl содержит окружение в ассоциативном массиве %ENV, вы можете установить PATH так $ENV=»/bin».

Команда env — основной путь выяснения текущих переменных окружения. Она может использоваться также, чтобы изменить их.

Более исчерпывающую информацию по основам механизма окружения можно взять из страниц руководства (man) ‘environ’, ‘execl’, ‘setenv’, или info ‘env’ и из документации по вашей оболочке.

Когда Linux загружается, первый процесс, который запускается является init. Это — специальный процесс, потому что не имеет родителя. Однако он первичный для всех процессов. Окружение init останется окружением всех процессов, если он не касаются окружения явно. Большинство процессов изменяют окружение.

Читайте также:  Добавить диск linux ubuntu

Init запускает группу процессов. Файл /etc/inittab сообщает то, какие процессы система запускает. Эти процессы работают в окружении, прямо унаследованом от init — например программа ‘getty’ пишет ‘login:’ на консоль. Если вы запускаете соединение PPP, вы должны помнить, что вы работаете в окружении init. Инициализация системы — это часто сценарий, который запускается отсюда. В Debian 1.3 скрипт инициализации /etc/init.d/rc вызывает, в свою очередь, другие сценарии инициализации.

Система содержит много запускаемых серверов (демоны), которые могут использовать или не использовать окружение, установленное по умолчанию. Большинство серверов запускается из сценария инициализации, и, таким образом, имеют окружение от init.

Когда пользователь заходит в систему, на среду действуют назначения, которые записаны в программу при компиляции, в системный скрипт инициализации и в пользовательский скрипт инициализации. Это довольно усложнено, и текущая ситуация не полностью удовлетворительна. Процесс различается, если пользователь заходит из консоли, XDM или из сети.

5. Процесс Init

Init — родительский процесс для всех остальных процессов системы. Другие процессы наследуют окружение процесса init и пути, прописанные в init. Только в редких случаях другие пути не установлены.

‘Пути init’ зафиксированы в исходниках программы и они выглядят так:

Заметьте, что пути init не содержат /usr/local/bin.

Все программы, которые запускаются из /etc/inittab работают в окружении init, особенно системные скрипты инициализации из /etc/init.d (Debian 1.3).

Все, что запускается из системных сценариев инициализации, имеет окружение init, как окружение по умолчанию. Например, syslogd, kerneld, pppd (когда стартует при запуске), gpm, lpd и inetd имеют окружение init, и не изменяют его.

Группа программ стартует из загрузочного скрипта, и PATH явно установлена в этом скрипте. Например: atd, sendmail, apache и squid.

Имеются другие программы, которые стартуют из сценариев начальной загрузки, но они заменяют путь полностью. Один такой пример — cron.

6. Процесс Login

В текстовой консоли имеется программа getty, ожидающая вход в систему пользователя. Она пишет ‘login:’ и другие сообщения. Работает в окружении init. Когда пользователь входит в систему, getty вызывает программу ‘login’. Эта программа устанавливает пользовательское окружение и вызывает оболочку.

Программа Login устанавливает пути, определенные в /usr/include/paths.h. ‘Пути login’ различны для root и других пользователей.

Пути обычных пользователей не содержат пути, содержащие любые sbin каталоги. Однако, они содержат текущий каталог, ‘.’, который считается опасным для пользователя root. Даже /usr/local/bin не указан для root.

Пути Login часто переписываются скриптом инициализации оболочки. Однако, возможно использовать другие программы, записанные в /etc/passwd как оболочки пользователя. Например, я использовал следующую строку, чтобы запускался PPP, когда я вхожу в систему, используя специальное имя пользователя. В этом случае, pppd имеет точный путь входа в систему.

7. Оболочки

Часто пользовательские процессы — дочерние процессы оболочки записаны в /etc/passwd для этого пользователя. Файлы инициализации оболочек часто изменяют пути.

В login, названию оболочки предшествует ‘-‘, для bash например, написано ‘-bash’. Это сигнал системе, что оболочка запускается при входе в систему. В этом случае, оболочка выполняет инициализационные файлы при входе в оболочку. Иначе происходит более легкая инициализация. Дополнительно оболочка проверяет — являются ли команды исходящими из файла или набираемыми на терминале. Это модифицирует инициализацию оболочки так, что неинтерактивная оболочка инициализируется совсем слегка, bash, в этом случае, не выполняет никакой инициализации.

7.1. bash

Как нормальная оболочка, bash просматривает общесистемный файл /etc/profile, где описано системное окружение и пути, которые могут быть установлены для пользователей bash. Однако, это не выполняется, когда система интерпретирует оболочку как не-интерактивную. Наиболее важный случай находится в rsh, когда удаленная команда выполняется на соседней машине. /etc/profile не запускается, и пути наследуются от rsh демона.

bash получает аргументы командной строки -login и -i, которые могут быть использованы, чтобы установить оболочку, как оболочку для входа или как интерактивную.

Пользователь может переписать значения, установленные в /etc/profile путем создания файлов

/.profile. Обратите внимание, что только самый первый из них выполняется — отличается от логики инициализации csh.

/.bash_login не выполняется специально для оболочки входа в систему и если .bash_profile существует, он не выполняется вообще.

Если bash используется с именем sh вместо имени bash, он эмулирует инициализацию bash: ищет файлы /etc/profile и

/.profile только для входных оболочек.

7.2. tcsh

При входе оболочка tcsh исполняет следующие файлы в данной последовательности:

Источник

Оцените статью