O bug do shellshock no bash funciona por meio de variáveis de ambiente. Honestamente, fiquei surpreso pelo fato de existir um recurso como:
"transmissão de definições de funções via env vars"
Portanto, essa pergunta, embora talvez não esteja perfeitamente formulada, é pedir um exemplo ou um caso em que seria necessário ter esse recurso?
Bônus. Outros shells zsh, dash etc. também possuem esse recurso?
bash
environment-variables
function
shellshock
humanidade e paz
fonte
fonte
parallel
obtém as definições de funções distribuídas se invocar várias instâncias do bash. Se não, dessa forma, seria necessário gravá-los em um arquivo, para que cada instância invocada lesse e você tivesse que lidar com problemas como quando esse arquivo pode ser removido..dot
cria o mesmo arquivo que o shell antigo fez. é assim que é feito - e isso faz sentido - ou você alimenta o novo shell com o arquivo como entrada quandoexec
ing. assim que for lido, o arquivo será armazenado em cache pelo kernel de qualquer maneira.Respostas:
Quando um script chama outro script, as variáveis do script pai podem ser exportadas e, em seguida, ficam visíveis no script filho. Exportar funções é uma generalização óbvia: exporte a função do pai, torne-a visível no filho.
O ambiente é a única maneira conveniente de um processo passar dados arbitrários para seus filhos. Os dados devem ser empacotados em cadeias que não contenham bytes nulos, o que não é uma dificuldade para as funções do shell. Existem outros métodos possíveis, como blocos de memória compartilhada ou arquivos temporários transmitidos por meio de descritores de arquivos, mas eles podem causar problemas com programas intermediários que não sabem o que fazer com eles ou os fechariam. Os programas esperam ser executados em um ambiente que contém variáveis que eles não conhecem ou não se importam, para não substituí-las ou apagá-las.
A escolha de usar o nome da função como o nome da variável de ambiente é estranha. Por um lado, 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 ao shell Bourne no SVR2 e funções exportadas no shell Versão 8 lançadas no mesmo ano (1984). Nesse shell, variáveis e funções usavam o mesmo espaço para nome. Não sei como funcionou a exportação de funções. O shell Heirloom é baseado em uma variante Bourne que possui funções, mas não as exporta.
O ATT ksh supostamente suporta funções de exportação, mas olhando para a fonte ou brincando com ela, não consigo ver isso, a partir do ksh93u.
Os clones de domínio público do Ksh (pdksh, mksh), dash e zsh não suportam funções de exportação.
fonte
BASH_FUNC_f%%=() { echo hi }
. Por que o bash analisaria outras variáveis de ambiente? Por que ele iria analisarBASH_FUNC_g%%
quando estou apenas ligandof
? (Aparentemente, pré-shellshock, a variável de ambiente foi chamado apenas def
oug
- mas eu ainda estou querendo saber por queg
teria sido analisado se eu não nunca chamarg
no meu script)f
, (1) verificar uma função shell chamadaf
, (2) verificar uma variável de ambiente chamadaf
e tentar analisá-la, (3) verificar cadaPATH
componente para um executável chamadof
. Como a análise de cada variável de ambiente como código do shell, na inicialização do shell, parece um design menos complicado?unset -f foo
, o bash não deve mais procurar uma definição de funçãofoo
no ambiente), ao listar funções (como você lida comdeclare -f
outras coisas além de ler todas as variáveis de ambiente?) e o que mais estiver pensando. Seu design só parece mais fácil porque você deixou de fora a maior parte. Por outro lado, fazer tudo na inicialização é um único pedaço de código e, depois disso, tudo simplesmente funciona.