Traducere: Alexander Ermolaev. SWSoft Pte Ltd.
Acest document descrie probleme comune cu variabilele de mediu Unix / Linux, în special cu variabila PATH. Variabila PATH conține o listă de directoare în care sunt căutate comenzi. Aplicabil pentru distribuția Debian Linux 1.3.
Această documentație este o documentație gratuită; îl puteți redistribui și / sau modifica în conformitate cu termenii Licenței Publice Generale GNU, publicată de Fundația pentru Software Liber; fie versiunea 2 a Licenței, fie (la alegere) orice versiune ulterioară.
Această documentație este distribuită în speranța că va fi utilă, dar FĂRĂ NICI O GARANȚIE; fără nici măcar garanția implicită de VANDABILITATE sau de FITNESS PENTRU UN SCOP SPECIC. Pentru mai multe detalii, consultați Licența publică generală GNU.
Acest document face parte din proiectul Linux HOWTO.
Toate procesele din Unix conțin un "mediu". Aceasta este o listă de variabile care conțin nume și valori, sunt șiruri de caractere și pot conține majoritatea caracterelor. Toate procesele din Unix au un proces părinte - procesul creat de acest proces se numește proces copil. Procesele copilului moștenesc mediul din procesul părinte. Ei pot face unele schimbări în mediu înainte de a accepta mediul deja prin procesele copilului lor.
În acest document, folosesc termenul "comandă", la care fac referire programele care ar trebui să aibă un nume scurt folosind mecanismul căii.
În Linux, pentru a porni procesul, sistemul de operare caută directoarele scrise în variabila PATH: puteți folosi mecanismul căii în care încercați să executați comanda. Dacă sistemul de operare primește un nume de fișier care nu conține '/', se caută directoarele din variabila de mediu PATH. Chiar dacă nu există o variabilă PATH în mediul înconjurător, vor fi accesate cel puțin directoarele / bin și / usr / bin.
În sh utilizați comanda de export pentru a seta mediul, în csh utilizați comanda setenv. De exemplu:
setenv PATH / usr / local / bin: / usr / bin: / bin: / usr / bin / X11: / usr / jocuri:.
Programele C pot utiliza funcția bibliotecă setenv () pentru a schimba mediul. Perl conține mediul în matricea asociativă% ENV, puteți seta PATH astfel încât $ ENV = "/ bin".Comanda env este principala modalitate de a afla variabilele de mediu actuale. Poate fi folosit și pentru a le schimba.
Informații mai detaliate despre elementele de bază ale mecanismului de mediu pot fi obținute din manualele "environ", "execl", "setenv" sau info "env" și din documentația pentru coajă.
Când boot-urile Linux, primul proces care este pornit este init. Acesta este un proces special, deoarece nu are un părinte. Cu toate acestea, este primordială pentru toate procesele. Mediul init va rămâne mediul tuturor proceselor dacă nu atinge în mod explicit mediul. Cele mai multe procese schimbă mediul.
Init inițiază un grup de procese. Rapoartele de fișiere / etc / inittab care procesează sistemul se execută. Aceste procese funcționează într-un mediu moștenit direct de la init - de exemplu, programul 'getty' scrie 'login:' la consola. Dacă începeți o conexiune PPP, trebuie să vă amintiți că rulați în mediul init. Inițializarea unui sistem este adesea un script care rulează de aici. În Debian 1.3, scriptul de inițiere /etc/init.d/rc provoacă, la rândul său, alte scripturi de inițializare.
Sistemul conține multe servere de pornire (daemone) care pot sau nu utilizează mediul implicit. Cele mai multe servere sunt pornite din scriptul de inițializare și, prin urmare, au un mediu de la init.
Când un utilizator se conectează la sistem, există acțiuni asupra mediului care sunt scrise în program în timpul compilării, în scriptul sistemului de inițializare și în scriptul de inițializare a utilizatorului. Acest lucru este destul de complicat, iar situația actuală nu este în întregime satisfăcătoare. Procesul este diferit dacă utilizatorul vine de la consola, XDM sau din rețea.
Init este procesul de bază pentru toate celelalte procese din sistem. Alte procese moștenesc mediul procesului init și căile specificate în init. Numai în cazuri rare, nu sunt stabilite alte modalități.
"Calele init" sunt fixate în codul sursă al programului și arată astfel:
Rețineți că căile de inițializare nu conțin / usr / local / bin.
Toate programele care rulează din / etc / inittab funcționează în mediul init, în special script-urile de inițializare a sistemului din /etc/init.d (Debian 1.3).
Tot ce este pornit din script-urile de inițializare a sistemului are mediul init ca mediu implicit. De exemplu, syslogd, kerneld, pppd (când începe de la pornire), gpm, lpd și inetd au mediul init și nu o schimbă.
Grupul de programe pornește de la scriptul de boot, iar PATH este instalat explicit în acest script. De exemplu: etc, sendmail, apache și squid.
Există și alte programe care pornesc de la scripturile de boot, dar înlocuiesc complet calea. Un astfel de exemplu este cron.
Programul de conectare instalează căile definite în /usr/include/paths.h. Căile de conectare sunt diferite pentru utilizatorii rădăcină și ceilalți utilizatori.
pentru utilizatorii obișnuiți (_PATH_DEFPATH):
pentru root (_PATH_DEFPATH_ROOT):
Căile utilizatorilor obișnuiți nu conțin căi care conțin directoare sbin. Cu toate acestea, ele conțin directorul curent, '.', Care este considerat periculos pentru utilizatorul rădăcină. Chiar și / usr / local / bin nu este specificat pentru rădăcină.
Căile de conectare sunt adesea suprascrise cu scriptul de inițializare a shell-ului. Cu toate acestea, este posibil să folosiți alte programe scrise în / etc / passwd ca shell-ul utilizatorului. De exemplu, am folosit următoarea linie pentru a porni PPP atunci când m-am logat folosind un nume de utilizator special. În acest caz, pppd are o cale de conectare exactă.
etu-ppp: viYabVlxPwzDl: 1000: 1000: Esa Turtiainen, PPP: /: / usr / sbin / pppd
Deseori, procesele de utilizator - procesele pentru copiile copiilor sunt scrise în / etc / passwd pentru acest utilizator. Shell fișierele de inițializare schimba adesea căile.
În login, numele shell-ului precede '-', pentru bash, de exemplu, este scris '-bash'. Acesta este semnalul către sistemul pe care shell-ul începe atunci când vă conectați la sistem. În acest caz, shell-ul execută fișierele de inițializare atunci când intră în shell. În caz contrar, apare mai ușor o inițializare. În plus, shell-ul verifică dacă comenzile ies din fișier sau sunt introduse pe terminal. Aceasta modifică inițializarea shell-ului, astfel încât coaja non-interactivă este inițializată ușor, bash, în acest caz, nu efectuează nici o inițializare.
Ca o coajă normală, bash se uită la un fișier / etc / profile pe întregul sistem care descrie mediul de sistem și căile care pot fi setate pentru utilizatorii bash. Totuși, acest lucru nu este adevărat atunci când sistemul interpretează shell-ul ca neinteractiv. Cel mai important caz este în rsh, când comanda de la distanță rulează pe următoarea mașină. / etc / profile nu pornește, iar căile sunt moștenite de la daemon rsh.
bash primește argumentele liniei de comandă -login și -i, care pot fi folosite pentru a seta shell-ul ca shell shell sau ca shell interactiv.
Utilizatorul poate suprascrie valorile setate în / etc / profile prin crearea fișierelor
/.profile. Rețineți că numai prima este executată - diferă de logica de inițializare csh.
/.bash_login nu este executat special pentru shell-ul de conectare, iar dacă .bash_profile există, acesta nu rulează deloc.
Dacă se folosește bash cu numele sh în loc de numele bash, acesta emulează bash de inițializare: caută fișierele / etc / profile și
/.profile numai pentru shell-urile de intrare.
Când vă conectați, shell-ul tcsh execută următoarele fișiere în această secvență: