我在这里没有展示太多代码,但我有一个修复的要求。我们的文件包含 100 多个函数,这些函数在生产中的各种 shell 脚本中使用。我们将其命名为。
functions.sh
到目前为止,每个脚本都调用其中的“functions.sh”文件,以便它可以访问更新的函数。像这样
#!/bin/bash
# comment
# comment
# Comment
./path/function.sh
echo "Date" > logging()
..
现在我们被要求取消这个调用:
./path/function.sh
来自未来将开发的脚本。 (以便可以添加更多此类文件)并确保一旦新的“functions.sh”部署到生产环境中,最新的函数就会在环境中自动刷新,并且任何脚本都可以直接使用其中定义的函数。我可以在 .bashrc 文件中将其称为
~/.functions.sh
或者还有什么我们必须做的,请记住脚本将通过 crontab 以非交互模式执行。 (所有脚本都是 bash 脚本)任何帮助都会受到赞赏。
谢谢
答案1
读https://www.gnu.org/software/bash/manual/bash.html#Bash-Startup-Files
对于非交互式 shell(例如通过 cron 运行脚本),bash 使用BASH_ENV
环境变量作为源文件的名称。
因此,为了获得最大的灵活性,您可以执行以下操作:
/some/path
├── functions.d
│ ├── func1.sh
│ ├── func2.sh
│ ├── ...
│ └── funcN.sh
└── functions.sh
并且functions.sh
可能是
#!/usr/bin/env bash
func_dir="${BASH_SOURCE[0]%/*}/functions.d"
if [[ -d "$func_dir" ]]; then
for f in "$func_dir"/*.sh; do
if [[ -r "$f" ]]; then
. "$f"
fi
done
fi
在您的 crontab 文件中,添加
BASH_ENV=/some/path/functions.sh
因此,您所要做的就是将 .sh 文件添加到该目录,您的 cron 脚本将获取它。
这使您可以灵活地创建每个仅包含一个函数定义的文件。不再有巨大的库文件。