Zitate sind erforderlich in export foo="$var"
oder local foo="$var"
(oder readonly
, typeset
, declare
und anderen Variablen deklarieren Befehle ) in:
dash
- das
sh
von NetBSD (auch basierend auf der Almquist-Shell).
- Die
sh
von FreeBSD 9.2 oder älter (siehe die Änderung in 9.3 )
yash
zsh
mit Versionen vor 5.1 in ksh
oder sh
Emulation (oder für export var="$(cmd)"
wo zsh
sonst Wortteilung durchführen würde (nicht Globbing)).
Da ansonsten die Variablenerweiterung einer Wortteilung und / oder Dateinamenerzeugung unterworfen wäre, wie bei jedem Argument für einen anderen Befehl.
Und werden nicht benötigt in:
bash
ksh
(alle Implementierungen)
- die
sh
von FreeBSD 9.3 oder neuer
- Busybox auf Aschebasis
sh
(seit 2005)
zsh
In zsh
wird split + glob nie bei der Parametererweiterung ausgeführt, es sei denn, in sh
oder ksh
Emulation, aber split (nicht glob) wird bei der Befehlssubstitution ausgeführt. Seit Version 5.1 sind export
/ local
und andere Deklarationsbefehle wie in den anderen oben genannten Shells Dual Keyword / Builtin- Befehle, was bedeutet, dass keine Anführungszeichen erforderlich sind, auch nicht in sh
/ ksh
emuliert und auch nicht für die Befehlssubstitution.
Es gibt spezielle Fälle, in denen ein Zitieren auch in diesen Shells erforderlich ist, obwohl:
a="b=some value"
export "$a"
Oder allgemeiner, links , wenn etwas von der =
(einschließlich der =
) notiert wird oder das Ergebnis einer Expansion (wie export 'foo'="$var"
, export foo\="$var"
oder export foo$((n+=1))="$var"
(das $((...))
auch tatsächlich zitiert werden sollte) ...). Oder mit anderen Worten, wenn das Argument to export
keine gültige Variablenzuweisung wäre, wenn es ohne das Argument geschrieben würde export
.
Wenn die export
/ local
Befehlsnamen selbst zitiert wird (auch auszugsweise wie "export" a="$b"
, 'ex'port a="$b"
, \export a="$b"
oder sogar ""export a="$b"
), um die Anführungszeichen $b
sind erforderlich , außer in AT & T ksh
und mksh
.
Wenn export
/ local
oder ein Teil davon das Ergebnis einer Erweiterung (wie in cmd=export; "$cmd" a="$b"
oder sogar export$(:) a="$b"
) oder in Dingen wie dryrun=; $dryrun export a="$b"
) ist, werden die Anführungszeichen in jeder Shell benötigt.
Im Fall von > /dev/null export a="$b"
werden die Anführungszeichen in pdksh
und einige seiner Ableitungen benötigt.
Denn command export a="$b"
die Anführungszeichen werden in jeder Shell benötigt, aber mksh
und ksh93
(mit den gleichen Vorbehalten command
und export
nicht das Ergebnis einer gewissen Erweiterung).
Sie werden in keiner Shell benötigt, wenn sie geschrieben werden:
foo=$var export foo
(Diese Syntax ist auch mit der Bourne-Shell kompatibel zsh
, funktioniert jedoch in neueren Versionen von nur in sh
/ ksh
emulation).
(Beachten Sie, dass dies var=value local var
nicht verwendet werden sollte, da das Verhalten von Shell zu Shell unterschiedlich ist.)
Beachten Sie auch, dass die Verwendung export
mit einer Zuweisung auch bedeutet, dass der Exit-Status von cmd
in export var="$(cmd)"
verloren geht. Es so zu machen, export var; var=$(cmd)
hat dieses Problem nicht.
Beachten Sie diesen Sonderfall auch bei bash
:
$ bash -c 'IFS=; export a="$*"; echo "$a"' bash a b
ab
$ bash -c 'IFS=; export a=$*; echo "$a"' bash a b
a b
Mein Rat wäre, immer zu zitieren.