Escapar de $ deve ser suficiente para fazer isso funcionar:
eval "parent_function() { echo \$(delegate_function); }"
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 ?
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
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.
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
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.
Tags bash shell-script function