PATH HOWTO, система, ядро, помощни програми, статии, библиотека на Linux Center, - експерт на Linux и

Този документ описва често срещани проблеми с променливите на средата Unix/Linux, особено променливата PATH. Променливата PATH съдържа списък с директории, в които да се търсят команди. Приложимо за разпространение на Debian Linux 1.3.

Тази документация е безплатна документация; можете да го разпространявате и/или модифицирате съгласно условията на Общия публичен лиценз на GNU, публикуван от Фондацията за свободен софтуер; или версия 2 на лиценза, или (по ваш избор) всяка друга версия.

Тази документация се разпространява с надеждата, че ще бъде полезна, но БЕЗ ВСЯКА ГАРАНЦИЯ; без дори подразбиращата се гаранция ЗА ТЪРГОВОСТ или ПРИГОДНОСТ ЗА КОНКРЕТНА ЦЕЛ. Вижте Общия публичен лиценз на GNU за повече подробности.

Този документ е част от проекта HOWTO на Linux.

Всички процеси на Unix съдържат "среда". Това е списък с променливи, които съдържат имена и стойности, те са низове и могат да съдържат повечето символи. Всички процеси в Unix имат родителски процес - процесът, създаден от този процес, се нарича дъщерен процес. Детските процеси наследяват средата от родителския процес. Те могат да направят някои промени в околната среда, преди да приемат околната среда вече от техните детски процеси.

В този документ използвам термина „команда“, за да се позова на програми, за които се предполага, че имат кратко име, използвайки механизма на пътя.

В Linux операционната система разглежда директориите, написани в променливата PATH, за да стартира процес: можете да използвате механизма на пътя, където и да се опитате да изпълните команда. Ако операционната система получи име на файл, което не съдържа '/', тогава се търсят директориите от променливата на средата PATH. Дори ако в средата няма променлива PATH, ще се търсят поне директориите/bin и/usr/bin.

В sh използвате командата за експортиране, за да зададете средата, в csh използвате командата setenv. Например:

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

Командата env е основният начин за откриване на текущите променливи на средата. Може да се използва и за тяхната промяна.

По-изчерпателна информация за основите на механизма на околната среда може да се намери в ръководствата на страниците 'environment', 'execl', 'setenv' или info 'env' и от документацията за вашата черупка.

Когато Linux стартира, първият процес, който започва, е init. Това е специален процес, тъй като той няма родител. Той обаче е основен за всички процеси. Началната среда ще остане среда на всички процеси, освен ако изрично не докосва околната среда. Повечето процеси променят средата.

Init стартира група от процеси. Файлът/etc/inittab указва кои процеси стартира системата. Тези процеси се изпълняват в среда, наследена директно от init - например програмата 'getty' записва 'login:' в конзолата. Ако стартирате PPP връзка, трябва да запомните, че работите в init среда. Инициализацията на системата често е скрипт, който се изпълнява от тук. В Debian 1.3 init скриптът /etc/init.d/rc извиква на свой ред други init скриптове.

Системата съдържа много стартови сървъри (демони), които могат или не могат да използват средата по подразбиране. Повечето сървъри се стартират от init скрипт и по този начин имат init среда.

Когато потребителят влезе в системата, средата се влияе от заданията, които се записват в програмата по време на компилация, в системния скрипт за инициализиране и в потребителския скрипт за инициализиране. Това е доста сложно и настоящата ситуация не е напълно задоволителна. Процесът е различен, ако потребителят е влязъл от конзолата, XDM или от мрежата.

Init е родителският процес за всички останали процеси в системата. Други процеси наследяват средата на процеса на init и пътищата на init. Само в редки случаи не се инсталират други пътища.

Пътищата на init са фиксирани в изходния код на програмата и изглеждат така:

Имайте предвид, че пътищата на init не съдържат/usr/local/bin.

Всички програми, които се изпълняват от/etc/inittab, се изпълняват в средата на init, особено системните скриптове за init от /etc/init.d (Debian 1.3).

Всичко, което се стартира от системните скриптове на init, има средата init като среда по подразбиране. Например syslogd, kerneld, pppd (когато са стартирани при стартиране), gpm, lpd и inetd имат init среда и не я променят.

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

Има и други програми, които започват от скриптове за зареждане, но те заместват целия път. Такъв пример е cron.

Текстовата конзола има програма за гети, която чака потребителят да влезе. Тя пише „вход:“ и други съобщения. Работи в init среда. Когато потребителят влезе, getty извиква програмата 'login'. Тази програма настройва потребителска среда и извиква черупката.

Програмата за вход задава пътищата, дефинирани в /usr/include/paths.h. „Пътищата за вход“ са различни за root и други потребители.

за редовни потребители (_PATH_DEFPATH):

Редовните потребителски пътища не съдържат пътища, съдържащи никакви sbin директории. Те обаче съдържат текущата директория „.“, Което се счита за опасно за основния потребител. Дори/usr/local/bin не е в списъка за root.

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

Често потребителски процеси - процесите на детска черупка се записват в/etc/passwd за този потребител. Файловете за инициализация на черупки често сменят пътищата.

При влизане името на черупката се предшества от '-', за 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 изпълнява следните файлове в тази последователност: