Loin ympäristömuuttujan yhteen pääteikkunaan ja yritin toistaa sen toisessa pääteikkunassa. Se ei näyttänyt mitään.
$TEST=hello
Sen jälkeen vietin sen ja yritin uudelleen echo
sitä eri pääteikkunassa . tulos oli sama kuin aiemmin.
export TEST
mutta jos suoritan saman koodin sisäänkirjautumisen yhteydessä (liitän koodin ~/.profile
tiedosto) -muuttujia voidaan käyttää missä tahansa pääteikkunassa. Mitä täällä tapahtuu? Mitä eroa on koodin suorittamisen päätelaitteessa ja saman suorittamisen sisäänkirjautumisen yhteydessä?
Vastaus
export
tekee muuttujasta jotain, joka sisällytetään lapsiprosessiympäristöihin. Se ei vaikuta muihin jo olemassa oleviin ympäristöihin. Yleensä ei ole tapaa asettaa muuttujaa yhteen päätelaitteeseen ja saada se automaattisesti näkyviin toiseen päätelaitteeseen, ympäristö luodaan kullekin prosessille itsenäisesti.
Lisäämällä se omaan .profile
tekee siitä, että ympäristösi asetetaan sisällyttämään uusi muuttuja joka kerta, kun kirjaudut sisään. Siksi sitä ei viedä kuoresta toiseen, vaan se käskee uutta kuorta sisällyttämään se, kun se määrittää alkuperäisen ympäristön.
Vastaus
Jokaisella prosessilla on useita ominaisuuksia, jotka prosessi voi asettaa erikseen ja itsenäisesti muut prosessit. Esimerkkejä ovat resurssirajat, umask, nykyinen hakemisto, ympäristömuuttujat ja jotkut muut. Prosessin luomisen yhteydessä (fork()
-järjestelmäkutsun avulla) lapsi perii nämä määritteet vanhemmalta. Tämän jälkeen lapsiprosessi voi asettaa nämä määritteet mielivaltaisesti. (Joitakin rajoituksia sovelletaan, prosessi ei saa lisätä kovien resurssien rajoituksia tai muuttaa nykyistä hakemistoa hakemistoksi, johon sillä ei ole exec-lupaa.)
Vain harvat ohjelmat muokkaavat ympäristömuuttujiaan, useimmat eivät vaivaudu Oletetaan, että jälkimmäinen tapaus. Joten jos lapsiprosessi luo itselleen uusia lapsia, näillä prosesseilla on samat ympäristömuuttujat kuin isovanhemmalla. Ja niin edelleen.
Nyt kuoressa on paljon muuttujia, jotka voidaan tarkastella set
-ominaisuudella (Bourne Shell -tyyppisissä kuorissa, ei C-kuoresta). Nämä muuttujat eivät ole ympäristömuuttujia, ellei niitä ole > Toim. Ympäristömuuttujia voidaan tarkastella env
-toiminnolla. Jos käynnistät ohjelman kuoren komentoriviltä, ohjelma perii ympäristömuuttujat kuoresta. shell-komentosarja.
Siksi sisäänkirjautumisen yhteydessä on kuori, joka lukee profiilitiedot (esim. ~/.profile
) ja perii ne käytännössä kaikille lapsille, lapsenlapsille ja niin edelleen. Näin ympäristömuuttuja-asetukset siirtyvät sisäänkirjautumisruudusta tai kirjautumiskomentosarjasta kaikkiin muihin sisäänkirjautumisistunnon aikana käynnistettyihin ohjelmiin.
Loin ympäristömuuttujan yhden pääteikkunan ja yritti toistaa sitä toisessa pääteikkunassa. Se ei näyttänyt mitään.
Yllä olevan selityksen mukaan tämä on odotettu tulos. Muutokset prosessin ympäristössä vaikuttavat vain tämän prosessin tuleviin lapsiin, ei nykyisiin.
$TEST=hello
Tämä ei todennäköisesti toimi joka tapauksessa, ellei muuttujan laajennus ole käytössä tai $TEST
on jo sopiva arvo. Jos haluat määrittää hello
muuttujalle TEST
, sinun on sanottava TEST=hello
(huomautus : ei $
).
Sen jälkeen vietin sen ja yritin uudelleen osoitteeseen
echo
se eri pääteikkunassa. tulos oli sama kuin aiemmin.
Tämä on jälleen kerran odotettu tulos.
mutta jos suoritan saman koodin kirjautumisen yhteydessä (liitän koodin tiedostoon
~/.profile
), voidaan käyttää mitä tahansa pääteikkunaa.
Tämä johtuu siitä, että päätelaitteen kuori on kuoren jälkeläinen, joka luki ympäristöasetukset kohdasta ~/.profile
ja siten peri nämä asetukset.