在shell中导出函数
请告诉我如何在父shell(bash,sh或ksh)中导出函数,以便该函数可用于从父进程启动的所有subprocess?
export -f
function特定于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中, autoload
是FPATH
工作所必需的。 在ksh
及其近亲中,我相信它只是简单地导致在FPATH
定义的函数覆盖PATH中的常规命令,就像直接定义的那样。
关于FPATH
和autoload
一些细节:
如果使用( )
创build子shell,那么它们将inheritance所有定义,参数和shellvariables的快照。
如果你像程序一样执行它们,那么你可以把定义放在.bashrc
。
如果您试图欺骗现有脚本执行包装器或replacePATH命令,那么.bashrc
将根据执行的细节而工作。 如果没有,你可以改为执行一个简单的包装脚本.
或定义函数的包含文件的source
,然后用shell脚本replace命令来执行相同的操作。
包装器脚本可能如下所示:
script=$1 shift . include.sh . $script "$@"
这个想法是,第一个参数是真实脚本的名称,其余参数是参数,然后运行上面的脚本。
declare -x -f NAME
更多信息
-f限制操作或显示function名称和定义 -x使NAME导出