Por que o bash ainda analisa / executa coisas colocadas na variável de ambiente?

9

O bug shellshock no bash funciona por meio de variáveis de ambiente. Honestamente fiquei surpreso pelo fato de que existe uma característica como:

"passando das definições de função via env vars"

Portanto, esta questão, embora talvez não seja perfeitamente formulada, é pedir um exemplo ou um caso em que seria necessário ter esse recurso?

Bônus. Outras conchas zsh, traço etc. também possuem esse recurso?

    
por humanityANDpeace 27.09.2014 / 13:28

1 resposta

4

Quando um script invoca outro script, variáveis do script pai podem ser exportadas e, em seguida, elas ficarão visíveis no script filho. A exportação de funções é uma generalização óbvia: exporte a função do pai, torne-a visível na criança.

O ambiente é a única maneira conveniente em que um processo pode transmitir dados arbitrários para seus filhos. Os dados devem ser empacotados em seqüências que não contenham bytes nulos, o que não é uma dificuldade para as funções do shell. Existem outros métodos em potencial, como blocos de memória compartilhada ou arquivos temporários transmitidos por meio de descritores de arquivos, mas podem causar problemas em programas intermediários que não sabem o que fazer com eles ou os fechariam. Os programas esperam ser executados em um ambiente que contenha variáveis que eles não conhecem ou não se importam, para que não sobrescrevam ou apaguem.

A escolha de usar o nome da função como o nome da variável de ambiente é estranha. Por um lado, isso significa que uma variável exportada entra em conflito com uma função exportada com o mesmo nome.

As funções exportadas são um recurso antigo. Funções foram adicionadas no shell Bourne no SVR2 , e funções exportadas no Versão 8 shell lançado no mesmo ano (1984). Nesse shell, variáveis e funções usavam o mesmo namespace. Não sei como funcionou a exportação de funções. O shell Heirloom é baseado em uma variante Bourne que tem funções, mas não as exporta.

ATT ksh supostamente suporta funções de exportação, mas olhando para a fonte ou brincando com ela, eu não consigo ver isso, a partir do ksh93u.

env -i /usr/bin/ksh -c 'f=variable; f () { echo function; }; typeset -fx f; /usr/bin/env; ksh -c f'
_=*25182*/usr/bin/env
PWD=/home/gilles
SHLVL=1
A__z="*SHLVL
ksh: f: not found

Os clones de domínio público do Ksh (pdksh, mksh), dash e zsh não suportam funções de exportação.

    
por 28.09.2014 / 02:58