将函数从 zsh 导出到 bash 脚本

Export a function from zsh to bash script

我在 .zshenv 中定义了一个函数,如下所示:

function my_func() {
echo 
}

然后我从 zsh 执行一个 bash 脚本,它的内容是:

type my_func

我收到一个错误:/tmp/test.bash: line 3: type: my_func: not found

如果我从 zsh 中输入 type my_func,我会得到:my_func is a shell function from

有没有办法在 bash 脚本中使用 zsh 定义的函数?它似乎适用于导出的变量

bash 是怎么做到的

Bash 本身可以将其功能导出到其他 bash shell。它通过导出以下形式的字符串环境变量来实现:

BASH_FUNC_functionNameHere%%=() { functionBodyHere; }

所以理论上你可以使用下面的 zsh 命令来为 bash:

导出你的函数
export "BASH_FUNC_my_func%%=() { $(echo; typeset -f my_func | tail -n+2) }"

但是,这不起作用,因为 zsh 不允许在标识符中使用 %%

解决方法

根据您的启动方式 bash,您或许能够将函数定义注入 bash 进程。

  • 当 运行 像 bash myScript./myScript 这样的 bash 脚本时,您可以使用 bash -c "$(typeset -f my_func); export -f my_func; myScript" 代替。

  • 当使用 bash 启动交互式 bash shell 时,您可以改用 bash -c "$(typeset -f my_func); export -f my_func; exec bash"

正确的方法

无论如何,你的函数必须是多语言的。也就是说,函数的源代码必须被 zsh 和 bash 都理解。如果您想导出许多函数或想要调用许多 bash 脚本,上述方法并不可行。

在自己的脚本文件中定义每个函数并将这些脚本的位置添加到 $PATH 会更容易。这样你就可以从每个 shell 调用你的“功能”,它们将始终独立于你当前的 shell.

工作

仅当您的函数不想修改父函数时,用脚本文件替换函数才有效 shell。 cd 或设置变量对调用者没有影响。如果你想做这样的事情,你仍然可以使用脚本文件,但必须使用 . myFunctionFile 来获取它。对于采购,源代码必须再次是多语言的。