2016-04-24 103 views
1

我有shell脚本:如何将shell函数从一个文件导入到另一个文件中?

#!/bin/bash 

export LD=$(lsb_release -sd | sed 's/"//g') 
export ARCH=$(uname -m) 
export VER=$(lsb_release -sr) 

# Load the test function 
/bin/bash -c "lib/test.sh" 

echo $VER 
DISTROS=('Arch' 
'CentOS' 
'Debian' 
'Fedora' 
'Gentoo') 
for I in "${DISTROS[@]}" 
do 
    i=$(echo $I | tr '[:upper:]' '[:lower:]') # convert distro string to lowercase 
    if [[ $LD == "$I"* ]]; then 
    ./$ARCH/${i}.sh 
    fi 
done 

正如你可以看到它应该运行shell脚本,这取决于它运行在其上的架构和操作系统上。它应该在运行此体系结构和特定于操作系统的脚本之前首先运行脚本lib/test.sh。这是lib/test.sh

#!/bin/bash 

function comex { 
    which $1 >/dev/null 2>&1 
} 

,当我用这个x86_64/arch.sh脚本在x86_64 Arch Linux的运行:

#!/bin/bash 

if comex atom; then 
    printf "Atom is already installed!" 
elif comex git; then 
    printf "Git is installed!" 
fi 

它返回的输出:

rolling 
./x86_64/arch.sh: line 3: comex: command not found 
./x86_64/arch.sh: line 5: comex: command not found 

如此明确的comex壳功能在x86_64/arch.sh脚本运行时未正确加载。因此,我很困惑,并且想知道为了正确定义comex函数需要做什么,以便它正确加载到这个体系结构和依赖于操作系统的最终脚本中。

我已经尝试使用. "lib/test.sh"而不是/bin/bash -c "lib/test.sh",并且我收到了完全相同的错误。我也尝试在循环中加入. "lib/test.sh",就在./$ARCH/${i}.sh行之前。这也失败了,返回相同的错误。

+2

'。 lib/test.sh',我相信。 –

回答

2

简要回答:你需要使用.source,而不是bash -c导入您的功能:

# Load the test function 
source "lib/test.sh" 

更长的答案:当你调用脚本bash -c,将创建一个子进程。这个子进程看到来自父进程的所有导出变量(包括函数)。但反之亦然。所以,你的脚本永远不会看到comex函数。相反,您需要直接在当前脚本中包含脚本代码,并使用.source命令来完成此操作。


2部分,你之后“来源” lib/test.sh,主脚本能够使用comex功能。但是arch脚本不会看到这个函数,因为它不会被导出到它们。您需要export -f comex

#!/bin/bash 

function comex { 
    which $1 >/dev/null 2>&1 
} 
export -f comex 
+0

应该在我原来的问题中说过,我已经尝试过使用'.',只是尝试了你的确切建议(用'source'),它也回来了:'滚动 ./x86_64/arch.sh:第3行:comex:命令未找到 ./x86_64/arch.sh:第5行:comex:命令未找到“ – BH2017

+0

我更新了我的答案。 – gudok

+0

将'export comex'添加到'lib/test.sh'脚本的末尾并没有什么区别。在'source“lib/test.sh”'行之后,也没有将'export comex'添加到主脚本中。另外函数名称是'comex'(简称“命令存在”)。 – BH2017

相关问题