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