有没有办法像在python中一样在bash上导入模块?

时间:2017-10-31 14:31:34

标签: linux bash shell

我最近一直在编写一些脚本,我发现将其他文件的一些常用功能分开是很有用的,例如' 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)

谢谢!

1 个答案:

答案 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

或沿着那些一般路线的东西。环境变量名称和默认位置的选择取决于您,以及您在目录上使用的子结构的数量是无限可变的。简单性和一致性至关重要。 (还要考虑版本控制是否会出现问题;如何管理实用程序的更新?)