export foo=bar
não é suportado pelo shell Bourne. Isso foi introduzido por ksh
.
No shell Bourne, você faria:
foo=bar export foo
ou:
foo=bar; export foo
ou com set -k
:
export foo foo=bar
Agora, o comportamento de:
export foo=bar
varia de shell para shell.
O problema é que atribuições e argumentos de comando simples são analisados e interpretados de forma diferente.
O foo=bar
acima é interpretado por alguns shells como um argumento de comando e por outros como uma atribuição (às vezes).
Por exemplo,
a='b c'
export d=$a
é interpretado como:
'export' 'd=b' 'c'
com alguns shells ( ash
, zsh
(na emulação sh), yash
) e:
'export' 'd=b c'
nos outros ( bash
, ksh
).
Enquanto
export \d=$a
ou
var=d
export $var=$a
seria interpretado da mesma forma em todos os shells (como 'export' 'd=b' 'c'
) porque essa barra invertida ou cifrão impedem que os shells que o suportem considerem esses argumentos como atribuições.
Se export
é citado ou o resultado de alguma expansão (mesmo em parte), dependendo da casca, também deixaria de receber o tratamento especial.
A sintaxe de Bourne embora:
d=$a; export d
é interpretado da mesma forma por todos os shells sem ambigüidade ( d=$a export d
também funcionaria no shell Bourne, mas não nas versões recentes de zsh
a menos que em sh
emulation).
Pode ficar muito pior do que isso. Veja por exemplo aquela recente discussão sobre bash
quando os arrays estão envolvidos.
(IMO, foi um erro introduzir esse recurso ).