Onde é que “export var = value” não está disponível?

29

Eu peguei - provavelmente na Usenet em meados da década de 1990 (!) - que a construção

export var=value

é um Bashism e que a expressão portátil é

var=value
export var

Venho advogando isso há anos, mas recentemente alguém me questionou sobre isso, e eu realmente não consigo encontrar nenhuma documentação para apoiar o que costumava ser uma crença sólida minha.

Pesquisando "export: command not found" não parece ser exibido em todos os casos em que alguém realmente teve esse problema, por isso mesmo que seja genuíno, acho que não é muito comum.

(Os acessos que recebo parecem ser novatos que copiam / colam pontuação e acabam com 'export: command not found ou algo assim, ou tentando usar export com sudo ; e newbie csh usuários tentando usar a sintaxe do shell Bourne.

Posso dizer com certeza que funciona no OS X e em várias distribuições do Linux, incluindo aquelas em que sh é dash .

sh$ export var=value
sh$ echo "$var"
value
sh$ sh -c 'echo "$var"'  # see that it really is exported
value

No mundo de hoje, é seguro dizer que export var=value é seguro de usar?

Eu gostaria de entender quais são as conseqüências. Se não for portátil para o v7 "Bourne classic", isso é pouco mais que trivialidades. Se houver sistemas de produção em que o shell realmente não possa lidar com essa sintaxe, seria útil saber.

    
por tripleee 28.03.2015 / 16:20

2 respostas

19
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 ).

    
por 28.03.2015 / 22:30
28

Não é uma base, mas uma sintaxe compatível com POSIX. Ele realmente começou como um kshism há muito tempo e foi mais tarde adotado por quase todos os shells baseados em sintaxe Bourne. A única exceção notória é /bin/sh no Solaris 10 e mais antigo, que adere à sintaxe do shell Bourne legado. Esperançosamente, o Solaris 11 usa um shell compatível com POSIX como /bin/sh .

A propósito, export já era um comando interno no shell Bourne legado, por isso, o googling para export: command not found foi enganoso.

Aqui está o comportamento herdado da shell Bourne quando export é combinado com uma afetação:

$ export var=22
var=22: is not an identifier

Para os nostálgicos, o código-fonte deste original Bourne shell está disponível e pode ser compilado para a maioria das distribuições Unix e Linux.

    
por 28.03.2015 / 17:24