He recogido, probablemente en Usenet a mediados de la década de 1990 (!), Que el constructo
export var=value
es un Bashismo, y que la expresión portátil es
var=value
export var
He estado abogando por esto durante años, pero recientemente, alguien me desafió al respecto, y realmente no puedo encontrar ninguna documentación que respalde lo que solía ser una creencia sólida mía.
Buscar en Google "export: command not found"
no parece mostrar ningún caso en el que alguien haya tenido este problema, por lo que incluso si es genuino, supongo que no es muy común.
(Los éxitos que consigo parecen ser novatos que copiar / pegar puntuacion, y terminó con 'export: command not found
o algunos de tales, o está tratando de utilizar export
con sudo
y novatos csh
. Usuarios que intentan utilizar la sintaxis Bourne shell)
Ciertamente, puedo decir que funciona en OS X y en varias distribuciones de Linux, incluidas las que sh
están dash
.
sh$ export var=value
sh$ echo "$var"
value
sh$ sh -c 'echo "$var"' # see that it really is exported
value
En el mundo de hoy, ¿es seguro decir que export var=value
es seguro de usar?
Me gustaría entender cuáles son las consecuencias. Si no es portátil para v7 "Bourne classic", eso es apenas más que trivialidades. Si hay sistemas de producción donde el shell realmente no puede hacer frente a esta sintaxis, sería útil saberlo.
fuente
busybox
viene con su propio caparazón mínimo? (No estoy en condiciones de intentarlo en este momento).Respuestas:
no era compatible con el shell Bourne (un antiguo shell de los años 70 del que
sh
derivan implementaciones modernas como ash / bash / ksh / yash / zsh). Eso fue introducido porksh
.En el shell Bourne, harías:
o:
o con
set -k
:Ahora, el comportamiento de:
varía de caparazón a caparazón.
El problema es que las asignaciones y los argumentos de comandos simples se analizan e interpretan de manera diferente.
El
foo=bar
anterior es interpretado por algunas conchas como un argumento de mando y por otros como una asignación (a veces).Por ejemplo,
se interpreta como:
con algunos shells (
ash
versiones anteriores dezsh
(en emulación sh),yash
) y:en los otros (
bash
,ksh
).Mientras
o
se interpretaría de la misma manera en todos los shells (as
'export' 'd=b' 'c'
) porque esa barra invertida o signo de dólar detiene los shells que lo admiten para considerar esos argumentos como asignaciones.Si
export
se cita a sí mismo o es el resultado de alguna expansión (incluso en parte), dependiendo del caparazón, también dejaría de recibir el tratamiento especial.Consulte " ¿Se necesitan comillas para la asignación de variables locales? " Para obtener más detalles al respecto.
Sin embargo, la sintaxis de Bourne:
todos los shells interpretan lo mismo sin ambigüedad (
d=$a export d
también funcionaría en el shell Bourne y los shells compatibles con POSIX, pero no en versiones recientes de, azsh
menos que sea ensh
emulación).Puede ser mucho peor que eso. Vea, por ejemplo, esa discusión reciente sobre
bash
cuándo están involucradas las matrices.(OMI, fue un error introducir esa función ).
fuente
foo=bar export foo
, ya que siempre lo había visto allí. Sé que la exportación es una función integrada, pero ¿por qué sefoo=bar; foo=baz export foo; echo $foo
comporta de manera diferentefoo=bar; foo=baz /bin/cat /dev/null; echo $foo
?export
son.declare
,export
recomiendo que cualquiera que se preocupe por la seguridad lea la discusión en el enlace que StéphaneChazelas proporcionó a bash.bugs .d=$a export d
es interpretado de la misma manera por todos los proyectiles sin ambigüedad ;-)d=$a export d
ya no funcionazsh
, así que actualicé la respuesta. Ver editar.No es un bashism sino una sintaxis compatible con POSIX. En realidad, comenzó como un kshismo hace mucho tiempo y más tarde fue adoptado por casi todos los shells basados en sintaxis Bourne. La única excepción notoria es
/bin/sh
Solaris 10 y versiones anteriores que se adhieren a la sintaxis de shell Bourne heredada. Con suerte, Solaris 11 utiliza un shell compatible con POSIX como/bin/sh
.Por cierto,
export
ya era un comando incorporado en el shell Bourne heredado, por lo que buscar en Googleexport: command not found
fue engañoso.Aquí está el comportamiento de shell Bourne heredado cuando
export
se combina con una afectación:Para los nostálgicos, el código fuente de este shell Bourne
originalestá disponible y puede compilarse para la mayoría de las distribuciones de Unix y Linux.fuente