Se necesitan Cotizaciones en export foo="$var"
o local foo="$var"
(o readonly
, typeset
, declare
y otras variables que se declara comandos ) en:
dash
- el
sh
de NetBSD (también basado en el shell Almquist).
- El
sh
de FreeBSD 9.2 o anterior (ver el cambio en 9.3 )
yash
zsh
con versiones anteriores a 5.1 en ksh
o sh
emulación (o para export var="$(cmd)"
dónde zsh
se dividiría la palabra de otra manera (no globular)).
De lo contrario, la expansión de la variable estaría sujeta a la división de palabras y / o generación de nombre de archivo como en cualquier argumento a cualquier otro comando.
Y no son necesarios en:
bash
ksh
(todas las implementaciones)
- el
sh
de FreeBSD 9.3 o más reciente
- busybox 'basado en cenizas
sh
(desde 2005)
zsh
En zsh
, split + glob nunca se realiza tras la expansión de parámetros, a menos que sea en sh
o ksh
emulación, pero split (no glob) se realiza tras la sustitución del comando. Desde la versión 5.1, export
/ local
y otros comandos de declaración se han convertido en comandos duales de palabras clave / incorporados como en los otros shells anteriores, lo que significa que no es necesario citar, incluso en sh
/ ksh
emulación e incluso para la sustitución de comandos.
Hay casos especiales en los que es necesario citar incluso en esos depósitos, como:
a="b=some value"
export "$a"
O más en general, en todo caso queda de la =
(incluyendo el =
) es citado o el resultado de una cierta expansión (como export 'foo'="$var"
, export foo\="$var"
o export foo$((n+=1))="$var"
(que $((...))
también debe citarse en realidad) ...). O en otras palabras, cuando el argumento de que export
no sería una asignación de variables válidas si son escritos sin el export
.
Si el export
/ local
nombre del comando en sí es citado (aunque sea en parte, como "export" a="$b"
, 'ex'port a="$b"
, \export a="$b"
, o incluso ""export a="$b"
), las comillas $b
son necesarias excepto en AT & T ksh
y mksh
.
Si export
/ local
o alguna parte es el resultado de una expansión (como en cmd=export; "$cmd" a="$b"
o incluso export$(:) a="$b"
) o en cosas como dryrun=; $dryrun export a="$b"
), entonces las comillas son necesarias en cada shell.
En el caso de > /dev/null export a="$b"
, son necesarias las comillas en pdksh
y algunos de sus derivados.
Para command export a="$b"
, las comillas son necesarias en cada shell pero mksh
y ksh93
(con las mismas advertencias sobre command
y export
no ser el resultado de alguna expansión).
Ellos no son necesarios en cualquier shell cuando se escribe:
foo=$var export foo
(que la sintaxis ser también compatible con el shell Bourne pero en versiones recientes de zsh
, trabajar sólo cuando en sh
/ ksh
emulación).
(Tenga en cuenta que var=value local var
no debe ser utilizado como el comportamiento varía a través de conchas).
También tenga en cuenta que el uso export
de una asignación también significa que el estado de salida cmd
de export var="$(cmd)"
se pierde. Hacerlo como export var; var=$(cmd)
no tiene ese problema.
También tenga cuidado con este caso especial 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
Mi consejo sería citar siempre.