Ich habe - wahrscheinlich im Usenet Mitte der neunziger Jahre (!) - das Konstrukt aufgegriffen
export var=value
ist ein Bashismus, und das ist der tragbare Ausdruck
var=value
export var
Ich befürworte dies seit Jahren, aber kürzlich hat mich jemand dazu herausgefordert, und ich kann wirklich keine Dokumentation finden, die meine früheren festen Überzeugungen bestätigt.
Googeln für "export: command not found"
scheint keine Fälle , in denen tatsächlich jemand dieses Problem hatte. Selbst wenn es echt ist, ist es nicht sehr häufig.
(Die Treffer, die ich bekomme, scheinen Neulinge zu sein, die Interpunktion kopieren / einfügen und am Ende mit 'export: command not found
oder einigen solchen gelandet sind oder versuchen, export
mit zu verwenden sudo
; und Neulingcsh
versuchen, die Bourne-Shell-Syntax zu verwenden.)
Ich kann mit Sicherheit sagen, dass es unter OS X und unter verschiedenen Linux-Distributionen funktioniert, einschließlich derjenigen, in denen es sich sh
befindet dash
.
sh$ export var=value
sh$ echo "$var"
value
sh$ sh -c 'echo "$var"' # see that it really is exported
value
In der heutigen Welt kann man das mit Sicherheit sagen export var=value
es sicher ist, es zu benutzen?
Ich würde gerne verstehen, was die Konsequenzen sind. Wenn es nicht portabel zu Version 7 "Bourne classic" ist, ist das kaum mehr als eine Kleinigkeit. Wenn es Produktionssysteme gibt, in denen die Shell mit dieser Syntax wirklich nicht zurechtkommt, wäre es hilfreich, dies zu wissen.
quelle
busybox
mit einer eigenen minimalen Schale? (Ich bin nicht in der Lage, es in dieser Sekunde richtig zu versuchen.)Antworten:
wurde von der Bourne-Shell nicht unterstützt (eine alte Shell aus den 70er Jahren, von der moderne
sh
Implementierungen wie ash / bash / ksh / yash / zsh abgeleitet sind). Das wurde eingeführt vonksh
.In der Bourne-Shell würden Sie Folgendes tun:
oder:
oder mit
set -k
:Nun, das Verhalten von:
variiert von Schale zu Schale.
Das Problem ist, dass Zuweisungen und einfache Befehlsargumente unterschiedlich analysiert und interpretiert werden.
Das
foo=bar
Obige wird von einigen Shells als Befehlsargument und von anderen als Aufgabe (manchmal) interpretiert.Zum Beispiel,
wird interpretiert als:
mit einigen Shells (
ash
, älteren Versionen vonzsh
(in der Sh-Emulation)yash
) und:in den anderen (
bash
,ksh
).Während
oder
würde in allen Schalen gleich interpretiert werden (als
'export' 'd=b' 'c'
) da dieser Backslash oder das Dollarzeichen die Shells stoppt, die ihn unterstützen, um diese Argumente als Zuweisungen zu betrachten.Wenn er
export
selbst angegeben wird oder das Ergebnis einer gewissen Ausdehnung ist (auch teilweise), würde er, abhängig von der Schale, auch die Sonderbehandlung einstellen.Weitere Informationen hierzu finden Sie unter " Werden für die Zuweisung lokaler Variablen Anführungszeichen benötigt? ".
Die Bourne-Syntax:
wird von allen Shells ohne Mehrdeutigkeit gleich interpretiert (
d=$a export d
funktioniert auch in der Bourne - Shell und in POSIX - kompatiblen Shells, jedoch nicht in neueren Versionen von,zsh
sofern nicht insh
Emulation).Es kann noch viel schlimmer werden. Siehe zum Beispiel die jüngste Diskussion über
bash
wann Arrays betroffen sind.(IMO, es war ein Fehler, diese Funktion einzuführen ).
quelle
foo=bar export foo
, da ich es immer dort gesehen hatte. Ich weiß, dass Export eine eingebaute Funktion ist, aber warum verhält esfoo=bar; foo=baz export foo; echo $foo
sich anders alsfoo=bar; foo=baz /bin/cat /dev/null; echo $foo
?export
.declare
, nichtexport
, empfehle ich , dass jeder, die Sorgen um die Sicherheit , die Diskussion zu lesen Link , dass StéphaneChazelas zu bash.bugs vorgesehen .d=$a export d
es von allen Shells ohne Mehrdeutigkeit gleich interpretiert wird ;-)d=$a export d
funktioniert in nicht mehrzsh
, daher habe ich die Antwort aktualisiert. Siehe Bearbeiten.Es ist kein Bashismus, sondern eine POSIX-konforme Syntax. Es begann eigentlich vor langer Zeit als Kshism und wurde später von fast allen Bourne-basierten Syntax-Shells übernommen. Die einzige berüchtigte Ausnahme ist
/bin/sh
Solaris 10 und älter, das an der Bourne-Shell-Syntax festhält. Hoffentlich verwendet Solaris 11 eine POSIX-kompatible Shell als/bin/sh
.Übrigens
export
war bereits ein Befehl in die Bourne-Shell integriert, weshalb das Suchen nachexport: command not found
irreführend war.Hier ist das Verhalten der Bourne-Shell in
export
Verbindung mit einer Beeinträchtigung:Für die Nostalgiker die Quellcode dieser
ursprünglichenBourne-Shell verfügbar und kann für die meisten Unix- und Linux-Distributionen kompiliert werden.quelle