在shell中导出功能


Answers:


105

export -f功能特定于Bash:

父母

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

儿童

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

2
导出功能仅可用于子呼叫吗?如何将其应用于当前的bash会话?喜欢.bashrc编写,但仅适用于当前的bash实例...
vp_arth 2014年

3
@vp_arth:如果您不需要在子调用中使用该函数,则无需导出它。无论哪种方式,它都可以在当前会话中使用(请注意,如果它是在文件中定义的,则需要提供文件源,而不是运行它以使其在当前会话中可用)。
暂停,直到另行通知。


3

如果您使用的是ksh或zsh:

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

如果FPATH在交互式解释器上设置了if ,并且在当前的shell环境或中找不到命令或函数,则在其中PATH列出的目录中搜索是否存在以丢失命令命名的文件。如果找到一个,则它来自当前的shell环境,并期望定义该函数。

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

您可以autoload在外壳程序脚本中使用该命令来加载所需的功能:

autoload fun_a fun_b

在zsh中,autoloadFPATH工作所需的。ksh其及其近亲中,我相信它会直接导致定义的函数FPATH覆盖PATH中的常规命令,就像直接定义它们一样。

对一些细节FPATHautoload


1

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

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

如果您试图欺骗现有脚本以执行包装程序或替换PATH命令,则该脚本.bashrc将根据执行的详细信息起作用。如果没有,您可以执行一个包装器脚本,该脚本只执行一个.source一个包含定义功能的包含文件,然后对要替换的命令的Shell脚本执行相同的操作。

包装器脚本可能类似于:

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

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


2
您能用一些编码示例来解释这些吗?我不想将我的函数放在.bashrc中
Sachin Chourasiya 2009年

1
declare -x -f NAME

更多信息

-f将动作或显示限制为函数名称和定义
-x使名称导出

6
请注意,这是特定于的bash。(ksh的对应物declaretypeset具有一个-x选项,但它仅适用于变量,而不是功能;同上的zsh)。
mklement0 2014年

0

功能本质上不可导出。但是,您可以导出字符串,因此这里有一个小技巧:

func="$(typeset -f funcname)"
export func

要导入函数,请从导出的字符串中重新定义它:

# in subshell
eval "$func"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.