将函数从 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
来获取它。对于采购,源代码必须再次是多语言的。
我在 .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
来获取它。对于采购,源代码必须再次是多语言的。