Różnica między „a = b” i „eksport a = b” w bash

50

Jaka jest różnica pomiędzy:

a=b

i

export a=b

W bash?

Rozumiem, że oba definiują zmienne środowiskowe, ale nie do końca rozumiem różnicę.

Adam Matan
źródło
Czy ktoś mógłby to edytować? Nie jest to wcale związane z Linuksem, ale zależy tylko od używanej powłoki. Myślę, że to bash tutaj, który działa również w systemie Windows.
innaM
Poprawiono mnie.
Adam Matan,

Odpowiedzi:

54

export propaguje zmienną do podprocesów.

Na przykład, jeśli tak

FOO=bar

wtedy podproces sprawdzający FOO nie znalazłby zmiennej, podczas gdy

export FOO=bar

pozwoli podprocesowi go znaleźć.

Ale jeśli FOOzostał już zdefiniowany jako zmienna środowiskowa, wówczas FOO=barzmodyfikuje wartość tej zmiennej środowiskowej.

Na przykład:

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

Starsze powłoki nie obsługiwały export FOO=barskładni; musiałeś pisać FOO=bar; export FOO.

Mike McQuaid
źródło
33
W rzeczywistości, jeśli nie używasz „ export”, nie definiujesz zmiennej środowiskowej, a jedynie zmienną powłoki. Zmienne powłoki są dostępne tylko dla procesu powłoki; zmienne środowiskowe są dostępne dla każdego kolejnego procesu, nie tylko dla powłok. Ponadto podpowłoki są poleceniami zawartymi w nawiasach, które mają dostęp do zmiennych powłoki, podczas gdy mówisz o procesach potomnych, które są przypadkowo powłokami.
wfaulk
Gdzie są one przechowywane?
HDave
28

Jeśli nie używasz export, nie definiujesz zmiennej środowiskowej; tylko zmienna powłoki.

Zmienne powłoki są dostępne tylko dla procesu powłoki; zmienne środowiskowe są dostępne dla każdego kolejnego procesu, nie tylko dla powłok.

wfaulk
źródło
2

Ponadto, jeśli chcesz mieć zmienną dostępną dla powłoki wywołującej bez użycia eksportu, możesz to zrobić:

Plik a.ksh to -

#!/bin/ksh
FOO=bar

W wierszu polecenia uruchom to

> . a.ksh

Spowoduje to uruchomienie poleceń w tej samej powłoce, a $ FOO będzie dostępny.

Natomiast,

> a.ksh

Udostępni $ FOO tylko w obrębie a.ksh, po wywołaniu do a.ksh nie będzie istniał.

alok
źródło
1
Poprawny. Pamiętaj, że „.” to tylko skrót do „źródła”, który czasami jest używany w skryptach dla lepszej czytelności. Zobacz „pomoc”. lub „źródło pomocy”, aby uzyskać szczegółowe informacje.
sleske
1

Oprócz tego, na co już udzielono odpowiedzi, obie te instrukcje niekoniecznie definiują (tj. Twórz vs ustaw) zmienną środowiskową, ponieważ „a” może już istnieć jako powłoka lub zmienna środowiskowa.

W drugim przypadku oba stwierdzenia są ściśle równoważne.

jlliagre
źródło