Zmienne powłoki a zmienne środowiskowe
MY_HOME="/home/my_user"
ustawia zmienną powłoki o nazwie MY_HOME
. Powłoki są językami programowania i mają zmienne (zwane również parametrami). Po tym przypisaniu możesz użyć wartości zmiennej, np echo "$MY_HOME"
. Za pomocą .
Zmienne powłoki są wewnętrzną koncepcją powłoki. Kiedy ta instancja powłoki kończy się, MY_HOME
zostaje zapomniana. Każdy program wie i przekazuje swoim dzieciom zmienne środowiskowe .
Wewnątrz powłoki zmienne środowiskowe i zmienne powłoki działają w bardzo podobny sposób. W rzeczywistości wszystkie zmienne środowiskowe, które powłoka dziedziczy od swojego rodzica, stają się zmiennymi powłoki. I odwrotnie, zmienna powłoki zdefiniowana w skrypcie powłoki stanie się zmienną środowiskową, jeśli zostanie wyeksportowana .
export MY_HOME="/home/my_user"
Więcej szczegółów możesz pominąć przy pierwszym czytaniu
Powodem, dla którego zmienne powłoki nie stają się automatycznie zmiennymi środowiskowymi, jest częściowo to, że skrypt może przypadkowo użyć nazwy zmiennej, która ma znaczenie dla uruchamianego programu, a częściowo tylko historycznej.
Niektóre bardzo stare powłoki wymagały export
użycia za każdym razem, gdy zmieniasz nazwę zmiennej, ale wszystkie nowoczesne powłoki śledzą przypisania zmiennych środowiskowych, dzięki czemu echo następującego fragmentu kodu bar
:
myvar=foo
export myvar
myvar=bar
env | grep '^myvar='
Ponadto niektóre bardzo stare powłoki wymagały osobnych poleceń dla myvar=foo
i export myvar
, ale wszystkie współczesne powłoki rozumieją export myvar=foo
.
Możesz uruchomić, set -a
aby wszystkie przypisania zmiennych powłoki automatycznie eksportowały zmienną, co myvar=foo
jest równoważne z tym, export myvar=foo
że najpierw uruchomiłeś ją set -a
w tej powłoce.
Przy cytowaniu
Cytowanie jest w większości ortogonalne. Jeśli wartość, którą przypisujesz zmiennej, nie zawiera żadnych znaków specjalnych dla powłoki, nie potrzebujesz cudzysłowów. Jeśli są znaki specjalne, musisz je chronić za pomocą pojedynczych cudzysłowów lub podwójnych cudzysłowów lub odwrotnych ukośników lub ich kombinacji. Dotyczy to zarówno zwykłej myvar=value
składni, jak i export
narzędzia.
Istnieje jedna różnica między składnią przypisania a export
składnią. Powłoka rozszerza dalej wyniki podstawień zmiennych $foo
, dokonując podziału pól (słów) i rozwijania nazw ścieżek (globbing) . Oznacza to, że jeśli wartością myvar
jest hello *
, to echo $myvar
wypisuje, hello
a następnie pojedynczą spację, a następnie listę plików w bieżącym katalogu. To prawie nigdy pożądane, stąd ogólna zasada, aby zawsze używać cudzysłowie zmiana zmiennych (chyba że wiesz, że potrzebują Państwo PathName ekspansję lub podziału dziedzinie): echo "$myvar"
. W przypadku prostego przypisania othervar=$myvar
w rzeczywistości niezawodnie kopiuje wartość myvar
doothervar
, ponieważ globowanie i dzielenie słów są blokowane w przypisaniach (ponieważ tworzą wiele słów, ale oczekuje się pojedynczego słowa). To zwolnienie nie ma jednak zastosowania export
. Więc jeśli chcesz zapamiętać prostą regułę, zawsze używaj podwójnych cudzysłowów wokół podstawień zmiennych.