如何在 bash 中“导出”函数?

如何在 bash 中“导出”函数?

我有一个脚本,里面有很多函数。

myfile1.sh:

func1() {}

func2() {}

我可以通过脚本调用它们:

myfile2.sh:

source myfile1.sh

func1

func2

但是,如果源自嵌套脚本,我该如何调用它们呢?

myfile3.sh:

./myfile2.sh

func2

func2: command not found

我可以“导出”函数myfile2以便每个人都知道它们吗?

我无法使用,export -f因为有很多功能。

答案1

注意,bash不是shexport -f是特定于bash外壳的。

如果脚本没有 she-bang,它将由类似 POSIX 的 shell 解释,该 shell 可能不是 bash。如果您打算bash在脚本中使用特定功能,则应确保它具有:

#! /path/to/bash -

she-bang 或您将其调用为bash path/to/the/script.另外,.sh对用该语言编写的脚本进行扩展也bash有点误导。

Nowbash是少数能够将函数导出到环境的 shell 之一(实际上使用bash仅由命令理解的特殊环境变量)。可以使用export -f特定于 bash 的命令来完成。还导出该选项打开bash时声明的所有函数。allexport

但无论如何,这些都不适合你的情况。export从一个 shell 中获取某些内容,无论是变量还是函数,以便该变量/函数在该 shell 的其他 shell 中可用执行(出口是为了保存东西执行)。

因此,即使myfile1.shmyfile2.sh导出它们声明的函数(在变量声明之前带有export -f或通过set -o allexport变量声明),也只会影响解释这些脚本的 shell 将执行的 shell。这里myfile2.sh不是执行myfile3.sh,而是相反。

在这里你需要你的myfile3.sh脚本来做:

source path/to/myfile2.sh

这样,它就是解释所有myfile1.shmyfile2.shmyfile3.sh脚本中的代码的同一个 shell,然后您就不需要导出任何函数。

sh请注意,在is 的系统上bash,导出函数可能不是一个好主意,因为这会影响脚本执行(递归)的所有 sh 和 bash 脚本以及 shell 命令行。例如,如果您这样做:

set -o allexport
uname() { echo Gotcha; }
somecmd

并且somecmd正在做一个popen("uname", "r")来获取unix名称,它会Gotcha在系统上而sh不是bash系统的真实名称(DarwinLinux...)。

相关内容