Переклад: Олександр Єрмолаєв. SWSoft Pte Ltd.
Цей документ описує загальні проблеми зі змінними оточення 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.
Цей документ є частиною проекту Linux HOWTO.
Всі процеси в Unix містять "оточення" (environment). Це список змінних, які містять імена і значення, вони є рядками і можуть містити більшість символів. Всі процеси в Unix мають батьківський процес - просесса створений цим процесом називається дочірнім. Дочірні процеси успадковують оточення від батьківського процесу. Вони можуть робити деякі зміни в оточенні перед прийняттям оточення вже їх дочірніми процесами.
У цьому документі я використовую термін «команда ', до якого відношу програми, які, як передбачається, мають коротку назву, використовуючи механізм шляхів.
У 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 залишиться оточенням всіх процесів, якщо він не стосуються оточення явно. Більшість процесів змінюють оточення.
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.
Програма 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 тільки для вхідних оболонок.
При вході оболонка tcsh виконує наступні файли в даній послідовності: