在shell中导出函数

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

export -ffunction特定于Bash:

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

儿童

 #!/bin/bash echo $(plus1 $(($1 * $2)) ) 

sh ,不可能导出一个函数,正如Charles Duffy所指出的那样 。

如果您使用ksh或zsh:

你可以使用环境variablesFPATH ,其中你可以放置所有的函数。

如果在交互式解释器上设置了FPATH ,并且在当前shell环境或PATH找不到命令或函数,则在那里列出的目录中将search存在以缺less的命令命名的文件。 如果find一个,它在当前的shell环境中被find,并且期望定义该function。

所以,你可以把所有的函数放在FPATH中的一个位置,并且子脚本也能够find它。

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

 autoload fun_a fun_b 

在zsh中, autoloadFPATH工作所必需的。ksh及其近亲中,我相信它只是简单地导致在FPATH定义的函数覆盖PATH中的常规命令,就像直接定义的那样。

关于FPATHautoload一些细节:

如果使用( )创build子shell,那么它们将inheritance所有定义,参数和shellvariables的快照。

如果你像程序一样执行它们,那么你可以把定义放在.bashrc

如果您试图欺骗现有脚本执行包装器或replacePATH命令,那么.bashrc将根据执行的细节而工作。 如果没有,你可以改为执行一个简单的包装脚本. 或定义函数的包含文件的source ,然后用shell脚本replace命令来执行相同的操作。

包装器脚本可能如下所示:

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

这个想法是,第一个参数是真实脚本的名称,其余参数是参数,然后运行上面的脚本。

 declare -x -f NAME 

更多信息

 -f限制操作或显示function名称和定义
 -x使NAME导出