Am creat o variabilă de mediu într-o fereastră de terminal și am încercat să o repet în altă fereastră de terminal. Asta nu a afișat nimic.

$TEST=hello 

După aceea l-am exportat și am încercat din nou să-l echo într-o fereastră de terminal diferită . rezultatul a fost același ca înainte.

export TEST 

dar dacă execut același cod la autentificare (adăugarea codului la ~/.profile fișier) variabilele pot fi utilizate în orice fereastră de terminal. Ce se intampla aici? Care este diferența dintre executarea unui cod într-un terminal și executarea același lucru la conectare?

Răspuns

export face din variabilă ceva care va fi inclus în mediile de proces copil. Nu afectează alte medii deja existente. În general, nu există o „modalitate de a seta o variabilă într-un terminal și să apară automat într-un alt terminal, mediul este stabilit pentru fiecare proces pe cont propriu.

Adăugarea la îl face astfel încât mediul dvs. să fie configurat pentru a include acea nouă variabilă de fiecare dată când vă conectați. De aceea, nu este exportat de la un shell la altul, ci în schimb solicită unui nou shell să includă când configurează mediul inițial.

Răspuns

Fiecare proces are mai multe atribute pe care procesul le poate seta individual și independent de alte procese. Exemple sunt limitele resurselor, masca, directorul curent, variabilele de mediu și altele. La crearea procesului (prin intermediul apelului de sistem fork()) copilul moștenește aceste atribute de la părinte. După aceasta, procesul copil poate seta aceste atribute în mod arbitrar. (Se aplică unele restricții, un proces poate să nu mărească limitele resurselor dificile sau să-și schimbe directorul curent într-un director pentru care nu are permisiunea de executare.)

Numai câteva programe își modifică variabilele de mediu, majoritatea nu deranjează Să presupunem că este din urmă caz. Deci, dacă un proces copil își creează copii în continuare, atunci aceste procese vor avea aceleași variabile de mediu ca bunicul. Și așa mai departe.

Acum, un shell are o mulțime de variabile care pot fi vizualizate cu set (în cochilii de tip Bourne Shell, nu știu despre C Shell). Aceste variabile nu sunt variabile de mediu decât dacă sunt export ed. Variabilele de mediu pot fi vizualizate cu env. Dacă lansați un program din linia de comandă a shell-ului, programul va moșteni variabilele de mediu din shell. La fel pentru un program lansat din un script shell.

Prin urmare, la conectare există un shell care citește datele profilului (de ex. ~/.profile) și le moștenește practic tuturor copiilor, nepoților și așa mai departe. Acesta este modul în care setările variabilelor de mediu trec de la shell-ul de conectare sau scriptul de conectare la toate celelalte programe lansate în cadrul sesiunii de conectare.

Am creat o variabilă de mediu în o fereastră de terminal și a încercat să-l ecou într-o altă fereastră de terminal. Aceasta nu afișează nimic.

Prin explicația de mai sus, acesta este rezultatul scontat. Modificările din mediul unui proces afectează numai copiii acestui proces care sunt creați de acum înainte, nu pe cei existenți.

$TEST=hello

Este puțin probabil să funcționeze oricum, cu excepția cazului în care expansiunea variabilă este dezactivată sau $TEST are deja un valoare potrivită. Dacă doriți să atribuiți hello variabilei TEST, atunci trebuie să spuneți TEST=hello (notă : nu $).

După aceea l-am exportat și am încercat din nou la echo în altă fereastră de terminal. rezultatul a fost același ca înainte.

Din nou, acesta este rezultatul scontat.

dar dacă execut același cod la conectare (adăugând codul la fișierul ~/.profile), pot fi utilizate orice fereastră de terminal.

Acest lucru se datorează faptului că shell-ul din terminal este un descendent al shell-ului care a citit setările de mediu din ~/.profile și astfel a moștenit aceste setări.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *