Rozważmy konkretny przykład. grep
Komenda używa zmiennej środowiskowej o nazwie GREP_OPTIONS
ustawić domyślne opcje.
Teraz. Biorąc pod uwagę, że plik test.txt
zawiera następujące wiersze:
line one
line two
uruchomienie polecenia grep one test.txt
powróci
line one
Jeśli uruchomisz grep z -v
opcją, zwróci niepasujące linie, więc wynik będzie
line two
Spróbujemy teraz ustawić opcję za pomocą zmiennej środowiskowej.
Zmienne środowiskowe ustawione bez export
nie będą dziedziczone w środowisku wywoływanych poleceń.
GREP_OPTIONS='-v'
grep one test.txt
Wynik:
line one
Oczywiście opcja -v
nie została przekazana grep
.
Chcesz użyć tego formularza, gdy ustawiasz zmienną tylko dla powłoki, na przykład for i in * ; do
, jeśli nie chcesz eksportować $i
.
Jednak zmienna jest przekazywana do środowiska tego konkretnego wiersza poleceń, więc możesz to zrobić
GREP_OPTIONS='-v' grep one test.txt
który zwróci oczekiwany
line two
Ten formularz służy do tymczasowej zmiany środowiska tego konkretnego wystąpienia uruchomionego programu.
Wyeksportowanie zmiennej powoduje jej odziedziczenie:
export GREP_OPTIONS='-v'
grep one test.txt
powraca teraz
line two
Jest to najczęstszy sposób ustawiania zmiennych w celu użycia później uruchomionych procesów w powłoce
Wszystko to odbyło się w bash. export
jest wbudowanym bash; VAR=whatever
jest składnią bash. env
z drugiej strony jest programem samym w sobie. Po env
wywołaniu zdarzają się następujące rzeczy:
- Polecenie
env
zostanie wykonane jako nowy proces
env
modyfikuje środowisko oraz
- wywołuje polecenie podane jako argument.
env
Proces otrzymuje przez command
proces.
Przykład:
env GREP_OPTIONS='-v' grep one test.txt
To polecenie uruchomi dwa nowe procesy: (i) env i (ii) grep (w rzeczywistości drugi proces zastąpi pierwszy). Z punktu widzenia grep
procesu wynik jest dokładnie taki sam jak uruchomienie
GREP_OPTIONS='-v' grep one test.txt
Możesz jednak użyć tego idiomu, jeśli jesteś poza bashem lub nie chcesz uruchamiać kolejnej powłoki (na przykład, gdy używasz exec()
rodziny funkcji zamiast system()
wywołania).
Dodatkowa uwaga dotycząca #!/usr/bin/env
Dlatego też #!/usr/bin/env interpreter
używa się tego idiomu #!/usr/bin/interpreter
. env
nie wymaga pełnej ścieżki do programu, ponieważ korzysta z execvp()
funkcji, która przeszukuje PATH
zmienną tak, jak robi to powłoka, a następnie zastępuje się uruchomieniem polecenia. Dlatego można go użyć, aby dowiedzieć się, gdzie interpreter (jak perl lub python) „siedzi” na ścieżce.
Oznacza to również, że modyfikując bieżącą ścieżkę, możesz wpływać na to, który wariant Pythona zostanie wywołany. Umożliwia to:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
zamiast uruchomić Calibre, spowoduje
I am an evil interpreter!
export key=value
jest to rozszerzona składnia i nie należy jej używać w przenośnych skryptach (tj#! /bin/sh
.).