unix bash – Definiendo la función bash dinámicamente usando eval

Pregunta:

Estoy tratando de definir una función bash dinámicamente usando el siguiente código:

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

La intención es que la función principal se envíe dinámicamente al delegado cuando se ejecute. Sin embargo, debido a la forma en que eval funciona, mi función se define de la siguiente manera:

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

¿Cómo puedo tener la definición como:

 parent_function () 
 { 
     echo $(delegate_function);
 }

¿Hay alguna manera de evitar que una parte de la cadena sea evaluada por eval ?

Respuesta:

En bash, como en la mayoría de los lenguajes, eval es algo que se debe evitar. Consulte, por ejemplo, las preguntas frecuentes de Greg: comando Eval y problemas de seguridad

Puede definir parent_function así:

parent_function=delegate_function

Siempre que desee utilizar parent_function para enviar delegate_function , simplemente ejecute:

$ $parent_function
output from delegate

Ejemplo de actualización de función dinámica

Definamos delegate_function y parent_function y $parent_function :

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

Ahora cambiemos delegate_function y $parent_function nuevamente:

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

$parent_function se actualiza instantáneamente para ejecutar la nueva versión de delegate_function.

Ejemplo de elección dinámica de nombre

Creemos nuestra función de delegado:

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

Asignemos un nombre:

$ parent_function=some_name

Ahora, demostremos la asignación dinámica de ese nombre:

$ typeset $parent_function=delegate_function
$ $some_name
delegate function executed

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım