Odpowiedzi:
$BASH
jest zmienną lokalną, która jest poprawna tylko w bieżącej powłoce (bash).
Zmienne środowiskowe, takie jak $SHELL
obowiązujące w całym systemie. W bieżącej powłoce Bash $BASH
wskazuje ścieżkę wykonania bash , podczas gdy $SHELL
wskazuje 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.
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
export
niekoniecznie ustawia zmienną środowiskową. stackoverflow.com/questions/7411455/…
export
ustawia 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?
export
absolutnie ustaw zmienną środowiskową
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.
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
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_VARIABLE
ta 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 .profile
lub .bashrc
(jeśli używasz bash).