在另一个脚本中找不到导出的函数

时间:2016-05-04 17:47:45

标签: bash shell

我正在尝试编写具有以下结构的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

全部谢谢!

1 个答案:

答案 0 :(得分:2)

导出变量或函数仅使其在执行export的shell的子进程中可用。执行命令(包括运行shell脚本)时,该脚本将在子进程中运行。因此,您在原始LibraryFunctions.sh进程的子级中运行TestLibraryFunctions.sh。当您返回原始脚本时,您不在LibraryFunctions.sh的孩子中,因此导出的功能不可见。

如果要在与当前进程相同的进程中运行shell脚本,请使用source.命令执行它。

source LibraryFunctions.sh

请注意,如果执行此操作,则不需要export函数,因为定义发生在同一个shell进程中,并且没有需要使用它的子shell进程。 / p>