Zmienna środowiskowa a zmienna powłoki, jaka jest różnica?

56

Ktoś mi powiedział, że:

BASH nie jest zmienną środowiskową, to zmienna powłoki

Co za różnica?

Tom Brito
źródło
brzmi jak to samo ma inny zakres?
Alexander Mills

Odpowiedzi:

35

$BASHjest zmienną lokalną, która jest poprawna tylko w bieżącej powłoce (bash).

Zmienne środowiskowe, takie jak $SHELLobowiązujące w całym systemie. W bieżącej powłoce Bash $BASHwskazuje ścieżkę wykonania bash , podczas gdy $SHELLwskazuje powłokę zdefiniowaną jako domyślna (która może mieć tę samą wartość).

Aby uzyskać wyjaśnienie zmiennych środowiskowych, zobacz Zmienne środowiskowe w Pomocy Ubuntu.

Takkat
źródło
1
Świetny link (+1) :)
Peter.O
12
Ta odpowiedź jest niepoprawna / niedokładna. Zmienne środowiskowe NIE są globalne / systemowe. Zmienne powłoki są prywatne dla aktualnie działającej powłoki i NIE są eksportowane (przekazywane) do żadnych procesów potomnych. Zmienne środowiskowe są eksportowane do dowolnych procesów potomnych. „MYVAR = prywatny; eksport OURVAR = wspólny; printenv” zgłasza tylko „OURVAR”, ponieważ gdy powłoka wykonuje polecenie printenv, eksportuje OURVAR, ale nie MYVAR.
CM
2
+1 do komentarza CM! Nigdy nie słyszałem, żeby różnica była wyjaśniona tak prosto i dokładnie !!! Ten komentarz powinien być odpowiedzią.
Jesse the Wind Wanderer
48

Zmienna środowiskowa jest globalnie dostępna w programie i programach potomnych. Zmienna powłoki jest dostępna tylko w bieżącej powłoce. Aby udostępnić zmienną powłoki jako zmienną środowiskową, użyj export VARNAME(bez dolara $).

Przykłady wyjaśnień:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

Inny sposób zdefiniowania zmiennej środowiskowej:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE
Lekensteyn
źródło
Nie sądzę, żeby to było poprawne. exportniekoniecznie ustawia zmienną środowiskową. stackoverflow.com/questions/7411455/…
Chris Stryczyński
3
@ChrisStryczyński exportustawia zmienną środowiskową dla procesów potomnych. Wpis, który podlinkowałeś, nie jest sprzeczny z tą odpowiedzią. Czy możesz wyjaśnić, dlaczego uważasz, że jest on niewłaściwy?
Lekensteyn,
exportabsolutnie ustaw zmienną środowiskową
David Tonhofer
9

Jest różnica. Zmienne powłoki i zmienne środowiska wyjaśnią to lepiej, niż potrafię, ale oto fragment:

Jeśli zmienna zostanie wprowadzona do zmiennej powłoki, musi zostać jawnie „wyeksportowana” do odpowiedniej zmiennej środowiskowej, aby wszelkie rozwidlone podprocesy mogły zobaczyć zmianę. Przypomnij sobie, że zmienne powłoki są lokalne dla powłoki, w której zostały zdefiniowane.

Peter.O
źródło
Komentuję własną odpowiedź .. Naprawdę podoba mi się link Pomoc Ubuntu w odpowiedzi Takkata ... (jest lepszy niż mój)
Peter.O
3
Dodatkowo twój link już nie działa!
1

Zmienna powłoki: krótkoterminowa, stosowana tylko do bieżącego wystąpienia powłoki, nie dotyczy całego systemu

Zmienna środowiskowa: długotrwałe użytkowanie, ważny system na całym świecie, globalnie dozwolone

Zgodnie z konwencją Shell Variable mają swoją nazwę jako małe litery podczas Envn. Zmienne są zapisywane wielkimi literami

Ashish
źródło
-1

Aby odpowiedzieć na to pytanie, najpierw spróbuj zrozumieć zakres zmiennej.

Podczas tworzenia nowej zmiennej jak SOME_ENV_VARIABLE="testing.txt"to rezyduje w SHELL scope, co oznacza, że może on być dostępny przez tego wystąpienia shell gdzie użytkownik jest zalogowany. Kiedy zmiana instancja na przykład po otwarciu nowego terminalu lub zmienić powłokę (na przykład ty przełącz na csh) nie możesz uzyskać dostępu do tej zmiennej.

Gdy eksportujesz tę zmienną, tak jak export SOME_ENV_VARIABLEta zmienna jest teraz dostępna w zakresie środowiska, oznacza to, że w takim przypadku, jeśli zmienisz powłokę, nadal będziesz mógł uzyskać dostęp do tej zmiennej. Spróbujmy zrozumieć na następującym przykładzie:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

Analogia: załóżmy, że masz mieszkanie z dwiema sypialniami i dzielisz je z innym współlokatorem. Dostęp do wspólnego obszaru może uzyskać każdy, ale nie twoje sypialnie, zmienna środowiskowa jest jak wspólny obszar, a zmienna skorupy jest jak sypialnia, jeśli chcesz coś we wspólnym obszarze, może być dostępny dla każdego, ale jeśli zatrzymasz go w sypialni, może to tylko być przez ciebie dostępnym.

Pamiętaj, że jeśli otworzysz nowy terminal, nie będziesz mieć dostępu do żadnej ze zmiennych, ponieważ zmieniasz to wystąpienie . W tym celu powinieneś dodać swoje zmienne do jednego .profilelub .bashrc(jeśli używasz bash).

Vishrant
źródło