Podniosłem - prawdopodobnie na Usenecie w połowie lat 90. (!) - ten konstrukt
export var=value
jest baszizmem, a tym przenośnym wyrażeniem jest
var=value
export var
Opowiadam się za tym od lat, ale ostatnio ktoś mnie o to rzucił i naprawdę nie mogę znaleźć żadnej dokumentacji na poparcie tego, co kiedyś było moją solidną wiarą.
Googling "export: command not found"
nie wydaje się przywoływać przypadków, w których ktoś rzeczywiście miał ten problem, więc nawet jeśli jest to autentyczne, myślę, że nie jest to zbyt powszechne.
(Trafienia, które dostaję, wydają się być nowicjuszami, którzy kopiują / wklejają interpunkcję i skończyli z 'export: command not found
niektórymi lub starają się export
z nimi korzystać sudo
; i nowi csh
użytkownicy próbują używać składni powłoki Bourne'a.)
Z pewnością mogę powiedzieć, że działa na OS X i na różnych dystrybucjach Linuksa, w tym tych, gdzie sh
jest dash
.
sh$ export var=value
sh$ echo "$var"
value
sh$ sh -c 'echo "$var"' # see that it really is exported
value
Czy w dzisiejszym świecie można bezpiecznie stwierdzić, że export var=value
jest bezpieczny w użyciu?
Chciałbym zrozumieć, jakie są konsekwencje. Jeśli nie jest przenośny na v7 „Bourne classic”, to niewiele więcej niż ciekawostki. Jeśli istnieją systemy produkcyjne, w których powłoka naprawdę nie radzi sobie z tą składnią, warto by to wiedzieć.
źródło
busybox
ma własnej minimalnej powłoki? (Nie jestem w stanie ani spróbować w tej chwili.)Odpowiedzi:
nie był obsługiwany przez powłokę Bourne'a (stara powłoka z lat 70., z której pochodzą nowoczesne
sh
implementacje, takie jak ash / bash / ksh / yash / zsh). Zostało to wprowadzone przezksh
.W powłoce Bourne'a zrobiłbyś:
lub:
lub z
set -k
:Teraz zachowanie:
różni się w zależności od powłoki.
Problem polega na tym, że przypisania i proste argumenty poleceń są analizowane i interpretowane w różny sposób.
The
foo=bar
Powyżej interpretować niektóre powłoki jako argument polecenia i innych jako przypisanie (czasami).Na przykład,
jest interpretowany jako:
z niektórymi powłokami (
ash
, starszymi wersjamizsh
(w emulacji sh)yash
) i:w pozostałych (
bash
,ksh
).Podczas
lub
będzie interpretowany tak samo we wszystkich powłokach (jak
'export' 'd=b' 'c'
), ponieważ ten ukośnik odwrotny lub znak dolara zatrzymuje te powłoki, które go obsługują, aby uznać te argumenty za przypisania.Gdyby
export
cytowany był sam lub wynik jakiegoś rozszerzenia (nawet częściowo), w zależności od powłoki, przestałby również otrzymywać specjalne traktowanie.Więcej informacji na ten temat znajduje się w części „ Czy do przypisywania zmiennych lokalnych potrzebne są oferty? ”.
Jednak składnia Bourne'a:
jest interpretowany tak samo przez wszystkie powłoki bez dwuznaczności (
d=$a export d
działałby również w powłokach Bourne'a i powłokach zgodnych z POSIX, ale nie w najnowszych wersjach,zsh
chyba że wsh
emulacji).Może być znacznie gorzej. Zobacz na przykład niedawną dyskusję na temat tego,
bash
kiedy tablice są zaangażowane.(IMO wprowadzanie tej funkcji było błędem ).
źródło
foo=bar export foo
, ponieważ zawsze go tam widziałem. Wiem, że eksport jest wbudowany, ale dlaczegofoo=bar; foo=baz export foo; echo $foo
zachowuje się inaczej niżfoo=bar; foo=baz /bin/cat /dev/null; echo $foo
?export
jest.declare
, nieexport
, polecam każdemu, kto dba o bezpieczeństwo, przeczytanie dyskusji pod linkiem, który StéphaneChazelas podał bash.bugs .d=$a export d
zinterpretować tak samo przez wszystkie muszle bez dwuznaczności ;-)d=$a export d
już nie działazsh
, więc zaktualizowałem odpowiedź. Zobacz edycję.To nie jest bashizm, ale składnia zgodna z POSIX. Zaczęło się od kshizmu już dawno temu, a później zostało przyjęte przez prawie wszystkie powłoki oparte na składni Bourne'a. Jedynym notorycznym wyjątkiem jest
/bin/sh
Solaris 10 i starszy, który trzyma się starszej składni powłoki Bourne'a. Mamy nadzieję, że Solaris 11 używa powłoki zgodnej z POSIX jako/bin/sh
.Nawiasem mówiąc,
export
było już wbudowanym poleceniem w starszej powłoce Bourne'a, więc google szukanieexport: command not found
było mylące.Oto starsze zachowanie powłoki Bourne'a w
export
połączeniu z afektacją:Dla osób nostalgicznych dostępny jest kod źródłowy tej
oryginalnejpowłoki Bourne'a, który można skompilować dla większości dystrybucji Uniksa i Linuksa.źródło