Eu percebi - provavelmente na Usenet em meados dos anos 90 (!) - que a construção
export var=value
é um bashismo, e que a expressão portátil é
var=value
export var
Eu venho defendendo isso há anos, mas recentemente alguém me desafiou e não consigo encontrar nenhuma documentação para apoiar o que costumava ser uma sólida crença minha.
Pesquisar no Google "export: command not found"
parece não trazer nenhum caso em que alguém realmente tenha esse problema; portanto, mesmo que seja genuíno, acho que não é muito comum.
(Os hits que recebo parecem ser iniciantes que copiam / colam pontuação e acabam com 'export: command not found
algo assim, ou tentando usá export
-lo sudo
; e csh
usuários novatos tentando usar a sintaxe do shell Bourne.)
Certamente posso dizer que ele funciona no OS X e em várias distribuições Linux, incluindo as que sh
estão 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 usar?
Eu gostaria de entender quais são as consequências. Se não é portátil para a v7 "Bourne classic", isso não passa de trivial. Se houver sistemas de produção em que o shell realmente não possa lidar com essa sintaxe, seria útil saber.
fonte
busybox
vem com sua própria concha mínima? (Eu não estou em uma posição para tentar qualquer direito esta segunda.)Respostas:
não era suportado pelo shell Bourne (um shell antigo dos anos 70 do qual derivam
sh
implementações modernas como ash / bash / ksh / yash / zsh). Isso foi introduzido porksh
.No shell Bourne, você faria:
ou:
ou com
set -k
:Agora, o comportamento de:
varia de casca para casca.
O problema é que atribuições e argumentos simples de comando são analisados e interpretados de maneira diferente.
O
foo=bar
acima é interpretado por alguns shells como um argumento de comando e por outros como uma atribuição (algumas vezes).Por exemplo,
é interpretado como:
com algumas conchas (
ash
, versões mais antigas dezsh
(na emulação sh)yash
) e:nos outros (
bash
,ksh
).Enquanto
ou
seria interpretado da mesma forma em todas as conchas (as
'export' 'd=b' 'c'
) porque essa barra invertida ou cifrão interrompe as conchas que a suportam a considerar esses argumentos como atribuições.Se
export
ele próprio for citado ou resultar de alguma expansão (mesmo em parte), dependendo da concha, também deixaria de receber o tratamento especial.Consulte " São necessárias cotações para atribuição de variável local? " Para obter mais detalhes sobre isso.
A sintaxe Bourne:
é interpretado da mesma forma por todos os shells sem ambiguidade (
d=$a export d
também funcionaria no shell Bourne e nos shells compatíveis com POSIX, mas não nas versões recentes,zsh
exceto emsh
emulação).Pode ficar muito pior que isso. Veja, por exemplo, uma discussão recente sobre
bash
quando matrizes estão envolvidas.(OMI, foi um erro introduzir esse recurso ).
fonte
foo=bar export foo
, como eu sempre o vi lá. Sei que a exportação é integrada, mas por quefoo=bar; foo=baz export foo; echo $foo
se comporta de maneira diferentefoo=bar; foo=baz /bin/cat /dev/null; echo $foo
?export
é.declare
, nãoexport
, recomendo que quem se preocupa com segurança leia a discussão no link que o StéphaneChazelas forneceu ao bash.bugs .d=$a export d
é interpretado da mesma por todos os conchas sem ambigüidade ;-)d=$a export d
não funciona maiszsh
, então eu atualizei a resposta. Veja editar.Não é um basismo, mas uma sintaxe compatível com POSIX. Na verdade, ele começou como um kshismo há muito tempo e foi posteriormente adotado por quase todos os shells Bourne baseados em sintaxe. A única exceção notória é
/bin/sh
no Solaris 10 e mais antigo, que segue a sintaxe herdada do shell Bourne. Felizmente, o Solaris 11 usa um shell compatível com POSIX como/bin/sh
.A propósito,
export
já era um comando embutido no shell herdado de Bourne, pelo que pesquisar no Googleexport: command not found
era enganador.Aqui está o comportamento do shell Bourne herdado quando
export
combinado com uma afetação:Para os nostálgicos, o código fonte deste shell Bourne
originalestá disponível e pode ser compilado para a maioria das distribuições Unix e Linux.fonte