gpt4 book ai didi

function - 如何将 shell 函数从一个文件导入到另一个文件中?

转载 作者:行者123 更新时间:2023-12-03 06:38:34 25 4
gpt4 key购买 nike

我有 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

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

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

最佳答案

简要回答:您需要使用 .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

关于function - 如何将 shell 函数从一个文件导入到另一个文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36829997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com