我有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
shell函数在x86_64/arch.sh
脚本运行时没有正确加载。因此,我很困惑,想知道我需要做些什么才能正确定义comex
函数,以便在此体系结构和操作系统相关的最终脚本中正确加载它。
我已尝试使用. "lib/test.sh"
代替/bin/bash -c "lib/test.sh"
,我收到了完全相同的错误。我还尝试将. "lib/test.sh"
添加到循环中,就在./$ARCH/${i}.sh
行之前。这也失败了,返回了同样的错误。
答案 0 :(得分:3)
简要回答:您需要使用.
或source
代替bash -c
导入您的功能:
# Load the test function
source "lib/test.sh"
更长的答案:当您使用bash -c
调用脚本时,会创建一个子进程。此子进程从父进程查看所有导出的变量(包括函数)。但反之亦然。因此,您的脚本永远不会看到comex
函数。相反,您需要在当前脚本中直接包含脚本代码,并且可以使用.
或source
命令来执行此操作。
第2部分。在“sourced”lib/test.sh
之后,您的主脚本可以使用comex
函数。但是arch脚本不会看到此函数,因为它不会导出到它们。您需要export -f comex
:
#!/bin/bash
function comex {
which $1 >/dev/null 2>&1
}
export -f comex