我正在尝试编写具有以下结构的unix脚本。基本上,我希望有一个我一直使用的函数的“库”脚本,并使用export -f functionName
导出所有函数。使用库函数的实际脚本将首先运行库脚本来执行导出命令,然后理论上可以访问刚刚导出的函数。但是,这不起作用,如错误所示。这两个脚本都已chmod 777
用于测试。我在下面尝试这些例子。这些不是某些prod代码的替代品。我复制并粘贴了我正在尝试的内容。
LibraryFunctions.sh:
#!/bin/bash
function getHelloWorldString() {
echo "Hello World"
}
export -f getHelloWorldString
TestLibraryFunctions.sh
#!/bin/bash
./LibraryFunctions.sh
function testExportedHelloWorld () {
echo $(getHelloWorldString)
}
testExportedHelloWorld
结果:
me@myHost:~/testDir $ ./TestLibraryFunctions.sh
./TestLibraryFunctions.sh: line 6: getHelloWorldString: command not found
编辑:对我有用的解决方案:
从LibraryFunctions.sh
中删除export -f getHelloWorldString
从TestLibraryFunctions.sh
中删除./LibraryFunctions.sh
在顶部
的TestLibraryFunctions.sh中添加了source LibraryFunctions.sh
-------新文件------:
LibraryFunctions.sh:
#!/bin/bash
function getHelloWorldString() {
echo "Hello World"
}
TestLibraryFunctions.sh
#!/bin/bash
source LibraryFunctions.sh
function testExportedHelloWorld () {
echo $(getHelloWorldString)
}
testExportedHelloWorld
全部谢谢!
答案 0 :(得分:2)
导出变量或函数仅使其在执行export
的shell的子进程中可用。执行命令(包括运行shell脚本)时,该脚本将在子进程中运行。因此,您在原始LibraryFunctions.sh
进程的子级中运行TestLibraryFunctions.sh
。当您返回原始脚本时,您不在LibraryFunctions.sh
的孩子中,因此导出的功能不可见。
如果要在与当前进程相同的进程中运行shell脚本,请使用source
或.
命令执行它。
source LibraryFunctions.sh
请注意,如果执行此操作,则不需要export
函数,因为定义发生在同一个shell进程中,并且没有需要使用它的子shell进程。 / p>