Definindo a função bash dinamicamente usando eval

1

Estou tentando definir uma função bash dinamicamente usando o seguinte código:

delegate_function() { echo "output from delegate"; }
eval "parent_function() { echo $(delegate_function); }"

A intenção é ter a função pai dinamicamente despachada para o delegado quando executada. No entanto, devido à maneira como eval funciona, minha função está sendo definida da seguinte forma:

kshitiz:/tmp$ type parent_function
parent_function is a function
parent_function () 
{ 
    echo output from delegate
}

Como posso ter a definição como:

 parent_function () 
 { 
     echo $(delegate_function);
 }

Existe uma maneira de evitar que alguma parte da string seja avaliada por eval ?

    
por Kshitiz Sharma 12.05.2016 / 00:59

3 respostas

3

Escapar de $ deve ser suficiente para fazer isso funcionar:

eval "parent_function() { echo \$(delegate_function); }"
    
por 12.05.2016 / 01:22
5

No bash, como na maioria das linguagens, eval é algo a ser evitado. Veja, por exemplo, o FAQ de Greg: Questões de segurança e comando do Eval

Você pode definir parent_function da seguinte forma:

parent_function=delegate_function

Sempre que você quiser usar parent_function para enviar delegate_function , apenas execute:

$ $parent_function
output from delegate

Exemplo de atualização de função dinâmica

Vamos definir delegate_function e parent_function e executar $parent_function :

$ delegate_function() { echo "delegate version 1"; }
$ parent_function=delegate_function
$ $parent_function
delegate version 1

Agora vamos alterar delegate_function e executar $parent_function novamente:

$ delegate_function() { echo "delegate version 2"; }
$ $parent_function
delegate version 2

$parent_function é atualizado instantaneamente para executar a nova versão de delegate_function.

Exemplo de escolha dinâmica de nome

Vamos criar nossa função de delegação:

$ delegate_function() { echo "delegate function executed"; }

Vamos atribuir um nome:

$ parent_function=some_name

Agora, vamos demonstrar a atribuição dinâmica desse nome:

$ typeset $parent_function=delegate_function
$ $some_name
delegate function executed
    
por 12.05.2016 / 01:22
0

Se você quiser que parent_function produza a saída de delegate_function , juntamente com algumas outras coisas, por exemplo,

parent_function()
{
    other command(s)
    echo $(delegate_function)
    other command(s)
}

então, se a saída de delegate_function for apenas uma única linha, você pode simplificar o acima para

parent_function()
{
    other command(s)
    delegate_function
    other command(s)
}

P.S. Você não precisa usar ; no final de uma linha; use-o (como separador) somente quando você está colocando várias coisas na mesma linha.

    
por 12.05.2016 / 06:07