Puncte:2

Diferența dintre „ecou” și „exporta” o variabilă de mediu?

drapel sa

Mediul este Ubuntu 18.

Dacă adaug o linie JAVA_HOME="/usr/java11" în /etc/environment și executați sursa /etc/environment , pot ecou această variabilă de mediu:

echo $JAVA_HOME
/usr/java11

Dar dacă încerc să o obțin din export, această variabilă nu este în listă:

export | grep JAVA_HOME
--rezultatul este gol--

Apoi folosesc exportați $JAVA_HOME=/usr/java8 pentru a exporta o variabilă (observați că aici este java8, nu java 11), pot avea:

export |grep JAVA_HOME
declara -x JAVA_HOME="/usr/java8"

Acum, încă mai pot echo $JAVA_HOME ca /usr/java11:

echo $JAVA_HOME
/usr/java11

Întrebare: care este diferența echo $variabilă și export | grep JAVA_HOME?

Încerc un program simplu python, os.environ.get("JAVA_HOME") returnează „/usr/java8” din export, nu ecou.

guiverc avatar
drapel cn
Menționați Ubuntu 18, deci acesta este un mediu Ubuntu Core 18 *conținut* sau numai *snap*? deoarece modelele *confinement* aflate în joc în 18 versiuni diferă de modelele mai deschise 18.04 - vă rugăm să fiți specifici.
drapel hr
Cred că problema aici este că `/etc/environment` este doar o listă de perechi nume=valoare. Când este citit de `pam_env`, acele variabile sunt exportate în mediu, dar introducerea lor în shell-ul dvs. curent creează doar variabile shell obișnuite - verificați cu `declare -p JAVA_HOME`, de exemplu.
Ben L avatar
drapel sa
@steeldriver , ce este „variabile shell obișnuite” și care sunt alte variabile?
Ben L avatar
drapel sa
@guiverc Îmi pare rău, nu știu ce este „conținut” și ce este „snap”. Este un container docker creat din „FROM ubuntu:18.04”
guiverc avatar
drapel cn
Ubuntu 18.04 este un produs diferit de cele 18 produse; Versiunile normale bazate pe *deb* Ubuntu (fără izolare) folosesc formatul *year.month*; diferă de produsele pe bază de 18 sau *an* care folosesc izolare.Ubuntu are produse bazate pe *an* din 2016 - ar trebui să fiți precis, deoarece 18 și 18.04 reprezintă produse diferite (o versiune 18 nu poate folosi un pachet *deb* - este doar *snap*). ; dar dacă ești familiarizat cu containerele ~știi asta; este la fel cu o terminologie diferită..
vanadium avatar
drapel cn
Răspunde asta la întrebarea ta? [Care este diferența dintre set, export și env și când ar trebui să le folosesc pe fiecare?](https://askubuntu.com/questions/205688/whats-the-difference-between-set-export-and-env-and-when -ar trebui să-l-utilizesc pe fiecare)
Puncte:12
drapel hr

Problema aici nu este chiar diferența dintre ecou și export, ci mai degrabă diferența dintre an variabilă de mediu si un simplu variabila shell (și, de asemenea, despre modul în care /etc/environment fișierul este utilizat în mod normal).

În special, deși /etc/environment se întâmplă să conţină linii de formular nume=valoare care sunt valide ca atribuiri de variabile shell POSIX, scopul său principal (într-un sistem Linux modern) este să fie citit de către pam_env modul în timpul inițializării sesiunii unui utilizator - este pam_env care le exportă în mediul utilizatorului.

Când surse /etc/environment în shell-ul tău, nu există nicio magie specială care să-i spună shell-ului că atribuirile sunt cele ale variabilelor de mediu (care sunt exportate în mediu și, prin urmare, moștenite de sub-procese) mai degrabă decât variabile shell obișnuite (care sunt doar disponibile în shell-ul curent). domeniul de aplicare).

Data viitoare când vă conectați, pam_env își va face magia și JAVA_HOME voi apoi apar în ieșirea de export | grep JAVA_HOME.

Vezi si

Ben L avatar
drapel sa
Vă mulțumim pentru a sublinia diferența dintre „variabila shell” și „variabila de mediu”.
vanadium avatar
drapel cn
„variabilele de mediu” din punct de vedere tehnic sunt și „variabile shell”. Sunt un subset.
Puncte:5
drapel cn

ecou și export sunt comenzi foarte diferite în primul rând.

  • ecou va afișa text. În echo $JAVA_HOME, shell-ul va înlocui $JAVA_HOME cu conținutul variabilei shell JAVA_HOME dacă este definit. In caz contrar, $JAVA_HOME va returna un șir gol.
  • export furnizează atributul „export” variabilei shell. exportați JAVA_HOME va seta atributul de export, adică variabila va fi disponibilă și în mediul oricărui subshell sau sub proces, mai degrabă decât numai în shell-ul curent. Dacă variabila nu este încă setată, o puteți defini în timp ce exportați ca în exportați JAVA_HOME=/usr/java11.

În /etc/environment, variabilele de mediu sunt înregistrate cu sintaxa unei atribuiri de variabile. Conținutul de /etc/environment într-o instalare implicită Ubuntu într-adevăr poate fi executată.Deci, dacă executați linia pe care ați inclus-o:

`JAVA_HOME=/usr/java11`

Apoi, tot ceea ce va face este să atribuiți variabilei shell PATH valoarea curentă.

Cu toate acestea, pentru că ați inclus variabila în /etc/environment, ar trebui să fie exportat efectiv în timpul următoarei porniri a sistemului dumneavoastră. Atunci, ar trebui să existe în export și să apară în echo $JAVA_HOME în primul terminal pe care îl deschideți. Deci, ceea ce observați în prezent este că nu ați repornit încă mașina după modificare /etc/environment (și nu a exportat variabila în alte moduri).

Puncte:3
drapel in

Pe baza celorlalte răspunsuri de aici, unele comenzi sunt paralele export dar pentru alte categorii de variabile sunt a stabilit (care funcționează de ex. VARIABLE=valoare atunci set | grep VARIABILĂ) și înv

Fiecare dintre aceste trei comenzi, atunci când nu primesc argumente, tipărește o listă de variabile; care variabile le vor imprima are de-a face cu tipurile de variabile pe care le gestionează comanda.

Vedea Care este diferența dintre set, export și env și când ar trebui să le folosesc pe fiecare?

echo $VARIABLE funcționează întotdeauna, deoarece toate tipurile de variabile pot fi citite ca $VARIABIL; cu toate acestea, aceasta înseamnă că nu vă oferă informații despre ce fel de variabilă este sau de unde provine.

Puncte:0
drapel us

ecou este o comandă pentru tipărirea textului și a variabilelor spre stdout (sau redirecționare).

export listează variabilele exportate curent în shell.

Acest thread explică de ce ai folosi export mult mai bine decât pot:

https://stackoverflow.com/questions/7411455/what-does-export-do-in-shell-programming ... face o treabă grozavă explicând ce înseamnă exportul

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.