我正在尝试使用以下代码动态定义 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_function
dispatch delegate_function
,只需运行:
$ $parent_function
output from delegate
动态功能更新示例
让我们定义delegate_function
andparent_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 你不需要;
在行尾使用;仅当您将多个内容放在同一行时才使用它(作为分隔符)。