我有一个脚本,里面有很多函数。
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
不是sh
。export -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.sh
或myfile2.sh
导出它们声明的函数(在变量声明之前带有export -f
或通过set -o allexport
变量声明),也只会影响解释这些脚本的 shell 将执行的 shell。这里myfile2.sh
不是执行myfile3.sh
,而是相反。
在这里你需要你的myfile3.sh
脚本来做:
source path/to/myfile2.sh
这样,它就是解释所有myfile1.sh
、myfile2.sh
和myfile3.sh
脚本中的代码的同一个 shell,然后您就不需要导出任何函数。
sh
请注意,在is 的系统上bash
,导出函数可能不是一个好主意,因为这会影响脚本执行(递归)的所有 sh 和 bash 脚本以及 shell 命令行。例如,如果您这样做:
set -o allexport
uname() { echo Gotcha; }
somecmd
并且somecmd
正在做一个popen("uname", "r")
来获取unix名称,它会Gotcha
在系统上而sh
不是bash
系统的真实名称(Darwin
,Linux
...)。