Function 在shell中导出函数

Function 在shell中导出函数,function,shell,export,Function,Shell,Export,请告诉我如何在父shell(bash、sh或ksh)中导出函数,以便该函数可用于从父进程启动的所有子进程?如果使用()创建子shell,则它们将继承所有定义、参数和shell变量的快照 如果像程序一样执行它们,则可以将定义放入.bashrc中 如果您试图欺骗现有脚本以执行包装器或路径命令的替换,则.bashrc将根据执行的详细信息工作。如果不是,您可以执行一个包装器脚本,该脚本只需执行定义函数的include文件的或source,然后对shell脚本和要替换的命令执行相同的操作 包装器脚本可能类

请告诉我如何在父shell(bash、sh或ksh)中导出函数,以便该函数可用于从父进程启动的所有子进程?

如果使用
()
创建子shell,则它们将继承所有定义、参数和shell变量的快照

如果像程序一样执行它们,则可以将定义放入
.bashrc

如果您试图欺骗现有脚本以执行包装器或路径命令的替换,则
.bashrc
将根据执行的详细信息工作。如果不是,您可以执行一个包装器脚本,该脚本只需执行定义函数的include文件的
source
,然后对shell脚本和要替换的命令执行相同的操作

包装器脚本可能类似于:

script=$1
shift
. include.sh
. $script "$@"

第一个参数是实际脚本的名称,其余参数是args,然后运行上面的脚本。

导出-f功能特定于Bash:

母公司

#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
孩子


如果您使用的是ksh或zsh:

您可以使用环境变量
FPATH
,在其中可以放置所有函数

如果在交互式解释器上设置了
FPATH
,并且在当前shell环境或
路径中找不到命令或函数,则会在其中列出的目录中搜索是否存在以缺少的命令命名的文件。如果找到一个,它将在当前的shell环境中进行源代码转换,并期望定义函数

因此,您可以将所有函数放在
FPATH
中的一个位置,子脚本也可以找到它

您可以在shell脚本中使用
autoload
命令来加载所需的函数:

autoload fun_a fun_b
在zsh中,
自动加载
FPATH
工作所必需的。
ksh
及其近亲中,我相信这只会导致在
FPATH
中定义的函数覆盖路径中的常规命令,如果直接定义,它们会这样做

有关
FPATH
autoload
的一些详细信息:

更多信息

-f restrict action or display to function names and definitions -x to make NAMEs export -f将操作或显示限制为函数名称和定义 -x使名称导出
sh
中,无法导出函数,因为。

函数本质上不可导出。但是,您可以导出字符串,因此我有一个小技巧:

func="$(typeset -f funcname)"
export func
要导入函数,请从导出的字符串中重新定义它:

# in subshell
eval "$func"

你能用一些编码示例来解释这些吗。我不想将我的函数放入。bashrcis导出的函数仅可用于子调用吗?如何将其应用于当前bash会话?喜欢.bashrc编写,但只适用于当前的bash实例…@vp_arth:如果您不需要在子调用中使用该函数,则不需要导出它。它在当前会话中以任何方式都可用(请注意,如果它是在文件中定义的,则需要源文件,而不是运行它以使其在当前会话中可用)。请注意,这是特定于
bash
。(
ksh
对应于
declare
typeset
,有一个
-x
选项,但它只适用于变量,不适用于函数;
zsh
同上)。
func="$(typeset -f funcname)"
export func
# in subshell
eval "$func"