Co robią wbudowane w bash „set” i „export”?


46

Trochę mi brakuje co do celu seti exportBash (i chyba też innych pocisków).

Sądzę, że służy to do ustawiania zmiennych środowiskowych, ale można to zrobić tylko VARIABLE=VALUE, prawda?

Również pisanie seti exportsamodzielnie pokazuje różne wartości.

Więc jaki jest ich cel?



Zawsze zaczynam od skryptu bash z następującymi dwoma. #! / usr / bin / env bash set -euxo pipefail Ten link pięknie to wyjaśnia. coderwall.com/p/fkfaqq/…
147,3 tys.

Odpowiedzi:


50

exporteksportuje do potomków bieżącego procesu, domyślnie nie są eksportowane. Na przykład:

$ foo=bar
$ echo "$foo"
bar
$ bash -c 'echo "$foo"'

$ export foo
$ bash -c 'echo "$foo"'
bar

set, z drugiej strony, ustawia atrybuty powłoki, na przykład parametry pozycyjne.

$ set foo=baz
$ echo "$1"
foo=baz

Zauważ, że baznie jest przypisany foo, staje się po prostu dosłownym parametrem pozycyjnym. Istnieje wiele innych rzeczy set(głównie opcje powłoki), patrz help set.

Jeśli chodzi o drukowanie, exportwywołane bez argumentów wypisuje wszystkie zmienne w środowisku powłoki. setdrukuje również zmienne, które nie są eksportowane. Może także eksportować niektóre inne obiekty (chociaż należy pamiętać, że nie jest to przenośne), patrz help export.


Dzięki, to bardzo przydatna odpowiedź. Jednak gdy ustawię http_proxy tylko za pomocą http_proxy = abc.com , będzie to widoczne dla procesów potomnych, np. Uruchomię wget bez mojego eksportu. Jak to może być?
mydoghasworms

2
@mydoghasworms Dwa możliwe powody. Po pierwsze, uruchamiasz polecenie jako foo=bar command. Jest to domyślny eksport dla pojedynczego polecenia. Drugą możliwością jest to, że http_proxyjest już wyeksportowany do twojego środowiska przed jego modyfikacją.
Chris Down,

Ach tak, masz rację. Świetnie, dziękuję!
mydoghasworms

6

Patrz help set: zestaw służy do ustawiania atrybutów powłoki i atrybutów pozycyjnych.

Zmienne, które nie są eksportowane, nie są dziedziczone przez procesy potomne. exportsłuży do oznaczania zmiennej do eksportu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.