我最近一直在编写一些脚本,我发现将其他文件的一些常用功能分开是很有用的,例如' utils'并将它们导入我的主脚本。为此,我使用了source ./utils.sh
。但是,这种方法似乎取决于我调用主脚本的当前路径。
我们说我有这个文件夹结构:
scripts/
|-tools/
| |-utils.sh
|-main.sh
在main.sh
:
source ./tools/utils.sh
some_function_defined_on_utils_sh
...
如果我从main.sh
文件夹运行scripts/
,一切正常。但是如果我从另一个目录./scripts/main.sh
运行它,脚本就会失败,因为它无法找到./tools/utils.sh
,这是有道理的。
我明白为什么这不起作用。我的问题是,是否有任何其他机制可以导入模块'进入我的脚本,并使所有当前dir不可知(就像python脚本from utils import some_function_defined_on_utils_sh)
)
谢谢!
答案 0 :(得分:1)
使用合适的默认设置定义环境变量,您可以在其中存储模块,然后使用.
(点)命令读取模块。
一个严肃的选择就是将文件放在路径上已有的目录中 - $HOME/bin
是私人资料的合理候选者;要分享的材料/usr/local/bin
。那么你甚至不需要指定文件的路径;你可以写. file-found-on-path
来阅读它。当然,缺点是如果有人切换了他们的PATH设置,或者在他们的PATH之前将一个同名文件放在另一个目录中,那么你最终会弄得一团糟。
这些文件甚至不需要是可执行的 - 它们只需要是可读的,可以使用点(.
)命令(或在Bash / C shell中使用source
命令)。
或者您可以更准确地指定位置,例如:
. ${SHELL_UTILITY_DIR:-/opt/shell/bin}/tools/utils.sh
或沿着那些一般路线的东西。环境变量名称和默认位置的选择取决于您,以及您在目录上使用的子结构的数量是无限可变的。简单性和一致性至关重要。 (还要考虑版本控制是否会出现问题;如何管理实用程序的更新?)