使用 eval 动态定义 bash 函数

使用 eval 动态定义 bash 函数

我正在尝试使用以下代码动态定义 bash 函数:

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

目的是让父函数在执行时动态分派给委托。然而,由于eval工作方式,我的函数定义如下:

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

我怎样才能将定义改为:

 parent_function () 
 { 
     echo $(delegate_function);
 }

有没有办法避免字符串的某些部分被评估eval

答案1

在 bash 中,就像在大多数语言中一样,eval这是需要避免的。例如,请参阅 Greg 的常见问题解答:Eval 命令和安全问题

你可以parent_function这样定义:

parent_function=delegate_function

任何时候您想要使用parent_functiondispatch delegate_function,只需运行:

$ $parent_function
output from delegate

动态功能更新示例

让我们定义delegate_functionandparent_function并运行$parent_function

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

现在让我们更改delegate_function并再次运行$parent_function

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

$parent_function立即更新以运行新版本的 delegate_function。

动态选择名称的示例

让我们创建我们的委托函数:

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

让我们指定一些名称:

$ parent_function=some_name

现在,让我们演示该名称的动态分配:

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

答案2

转义$应该足以使这项工作成功:

eval "parent_function() { echo \$(delegate_function); }"

答案3

如果您想parent_function生成 的输出delegate_function以及其他一些内容,例如,

父函数()
{
    其他命令
    回声 $(委托函数)
    其他命令
}

那么,如果输出delegate_function只是一行,您可以将上面的内容简化为

父函数()
{
    其他命令
    委托函数
    其他命令
}

PS 你不需要;在行尾使用;仅当您将多个内容放在同一行时才使用它(作为分隔符)。

相关内容