Les cotes sont nécessaires export foo="$var"
ou local foo="$var"
(ou readonly
, typeset
, declare
et d' autres variables déclarant commandes ) en:
dash
- le
sh
de NetBSD (également basé sur le shell Almquist).
- La version
sh
de FreeBSD 9.2 ou plus ancienne (voir la modification dans la 9.3 )
yash
zsh
avec les versions antérieures à 5.1 in ksh
ou sh
emulation (ou pour export var="$(cmd)"
où zsh
effectuerait le fractionnement des mots autrement (non globbing)).
Comme dans le cas contraire, le développement des variables serait sujet à la division des mots et / ou à la génération du nom de fichier, comme dans tout argument d'une autre commande.
Et ne sont pas nécessaires dans:
bash
ksh
(toutes les implémentations)
- la version
sh
de FreeBSD 9.3 ou plus récente
- busybox 'basé sur les cendres
sh
(depuis 2005)
zsh
Dans zsh
, split + glob n'est jamais utilisé lors du développement des paramètres, à moins que in sh
ou ksh
émulation, mais split (et non glob), lors de la substitution de commande. Depuis la version 5.1, les commandes export
/ local
et autres déclarations sont devenues des commandes doubles à mots clés / intégrées, comme dans les autres shells ci-dessus, ce qui signifie que les guillemets ne sont pas nécessaires, même dans sh
/ ksh
émulation et même pour la substitution de commandes.
Il y a des cas spéciaux où la citation est nécessaire même dans ces coquilles bien que:
a="b=some value"
export "$a"
Ou plus généralement, si tout ce qui reste du =
(y compris le =
) est cité ou le résultat d'une expansion (comme export 'foo'="$var"
, export foo\="$var"
ou export foo$((n+=1))="$var"
(qui $((...))
devrait également être cité en fait) ...). Ou en d'autres termes, lorsque l'argument export
ne serait pas une affectation de variable valide s'il était écrit sans le export
.
Si le export
/ local
nom de la commande elle - même est cité (même en partie comme "export" a="$b"
, 'ex'port a="$b"
, \export a="$b"
, ou même ""export a="$b"
), les guillemets autour $b
sont nécessaires , sauf pour AT & T ksh
et mksh
.
Si export
/ local
ou une partie de celle-ci est le résultat d'une expansion (comme dans cmd=export; "$cmd" a="$b"
ou même export$(:) a="$b"
) ou dans des choses comme dryrun=; $dryrun export a="$b"
), alors les guillemets sont nécessaires dans chaque shell.
Dans le cas de > /dev/null export a="$b"
, les guillemets sont nécessaires dans pdksh
et certains de ses dérivés.
Car command export a="$b"
, les guillemets sont nécessaires dans chaque shell mais mksh
et ksh93
(avec les mêmes mises en garde concernant command
et export
ne résultant pas d'une certaine expansion).
Ils ne sont nécessaires dans aucun shell lorsqu'ils sont écrits:
foo=$var export foo
(Cette syntaxe étant également compatible avec le shell Bourne mais dans les versions récentes de zsh
, ne fonctionne que dans sh
/ ksh
émulation).
(notez que cela var=value local var
ne devrait pas être utilisé car le comportement varie selon les coquilles).
Notez également que l'utilisation export
d'une affectation signifie également que le statut de sortie de cmd
in export var="$(cmd)"
est perdu. Le faire en tant que export var; var=$(cmd)
n'a pas ce problème.
Méfiez-vous également de ce cas particulier avec bash
:
$ bash -c 'IFS=; export a="$*"; echo "$a"' bash a b
ab
$ bash -c 'IFS=; export a=$*; echo "$a"' bash a b
a b
Mon conseil serait de toujours citer.