Le quotazioni sono necessari export foo="$var"
o local foo="$var"
(o readonly
, typeset
, declare
ed altre variabili che dichiara comandi ) in:
dash
- il
sh
di NetBSD (basato anche sulla shell Almquist).
- Il
sh
di FreeBSD 9.2 o precedente (vedi la modifica in 9.3 )
yash
zsh
con versioni precedenti alla 5.1 in ksh
o sh
emulazione (o per export var="$(cmd)"
dove zsh
altrimenti si comporterebbe la suddivisione delle parole (non globbing)).
Altrimenti l'espansione variabile sarebbe soggetta alla suddivisione delle parole e / o alla generazione di nomi di file come in qualsiasi argomento di qualsiasi altro comando.
E non sono necessari in:
bash
ksh
(tutte le implementazioni)
- il
sh
di FreeBSD 9.3 o più recente
- busybox 'a base di cenere
sh
(dal 2005)
zsh
In zsh
, split + glob non viene mai eseguito al momento dell'espansione dei parametri, a meno che in sh
o ksh
emulazione, ma split (non glob) viene eseguito in sostituzione del comando. Dalla versione 5.1, export
/ local
e altri comandi di dichiarazione sono diventati comandi a doppia parola chiave / incorporati come nelle altre shell precedenti, il che significa che il quoting non è necessario, anche in sh
/ ksh
emulazione e persino per la sostituzione dei comandi.
Ci sono casi speciali in cui è necessario un preventivo anche in quelle shell, come:
a="b=some value"
export "$a"
O più in generale, se viene citato qualcosa a sinistra del =
(incluso il =
) o il risultato di una certa espansione (come export 'foo'="$var"
, export foo\="$var"
o export foo$((n+=1))="$var"
(che $((...))
dovrebbe anche essere citato effettivamente) ...). O in altre parole quando l'argomento export
non sarebbe un'assegnazione variabile valida se scritto senza il export
.
Se il export
/ local
nome del comando stesso è citato (anche solo in parte, come "export" a="$b"
, 'ex'port a="$b"
, \export a="$b"
, o anche ""export a="$b"
), le virgolette $b
sono necessarie tranne in AT & T ksh
e mksh
.
Se export
/ local
o parte di esso è il risultato di qualche espansione (come in cmd=export; "$cmd" a="$b"
o anche export$(:) a="$b"
) o in cose simili dryrun=; $dryrun export a="$b"
), allora le virgolette sono necessarie in ogni shell.
Nel caso di > /dev/null export a="$b"
, le quotazioni sono necessarie in pdksh
e alcuni dei suoi derivati.
Per command export a="$b"
, le virgolette sono necessarie in ogni shell ma mksh
e ksh93
(con gli stessi avvertimenti circa command
e export
non essere il risultato di una certa espansione).
Non sono necessari in nessuna shell quando sono scritti:
foo=$var export foo
(tale sintassi è anche compatibile con la shell Bourne ma nelle versioni recenti di zsh
, funziona solo quando è in sh
/ ksh
emulazione).
(nota che var=value local var
non dovrebbe essere usato poiché il comportamento varia tra le shell).
Si noti inoltre che l'utilizzo export
con un'assegnazione significa anche che lo stato di uscita di cmd
in export var="$(cmd)"
viene perso. Farlo perché export var; var=$(cmd)
non ha questo problema.
Fai attenzione anche a questo caso speciale con bash
:
$ bash -c 'IFS=; export a="$*"; echo "$a"' bash a b
ab
$ bash -c 'IFS=; export a=$*; echo "$a"' bash a b
a b
Il mio consiglio sarebbe di citare sempre.