使用 eval 动态定义 bash 函数

Ksh*_*rma 5 bash shell-script function

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

delegate_function() { echo "output from delegate"; }
eval "parent_function() { echo $(delegate_function); }"
Run Code Online (Sandbox Code Playgroud)

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

kshitiz:/tmp$ type parent_function
parent_function is a function
parent_function () 
{ 
    echo output from delegate
}
Run Code Online (Sandbox Code Playgroud)

我如何才能将定义改为:

 parent_function () 
 { 
     echo $(delegate_function);
 }
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*024 10

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

你可以这样定义parent_function:

parent_function=delegate_function
Run Code Online (Sandbox Code Playgroud)

任何时候你想用来parent_functiondispatch delegate_function,只要运行:

$ $parent_function
output from delegate
Run Code Online (Sandbox Code Playgroud)

动态函数更新示例

让我们来定义delegate_function和parent_function并运行$parent_function:

$ delegate_function() { echo "delegate version 1"; }
$ parent_function=delegate_function
$ $parent_function
delegate version 1
Run Code Online (Sandbox Code Playgroud)

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

$ delegate_function() { echo "delegate version 2"; }
$ $parent_function
delegate version 2
Run Code Online (Sandbox Code Playgroud)

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

名称动态选择示例

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

$ delegate_function() { echo "delegate function executed"; }
Run Code Online (Sandbox Code Playgroud)

让我们指定一些名称:

$ parent_function=some_name
Run Code Online (Sandbox Code Playgroud)

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

$ typeset $parent_function=delegate_function
$ $some_name
delegate function executed
Run Code Online (Sandbox Code Playgroud)


ado*_*nis 6

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

eval "parent_function() { echo \$(delegate_function); }"
Run Code Online (Sandbox Code Playgroud)