在 bash 中,有时我想在多个脚本中重用一个函数。在所有脚本中重复该函数的定义是否不好?如果是这样,有什么好的做法吗?
下面的方法是个好主意吗?
- 将函数的定义包装
myfunction
在其自己的脚本中define_myfunction.sh
, - 在调用该函数的任何脚本中,
source define_myfunction.sh
,然后调用该函数myfunction arg1 arg2 ...
。
谢谢。
答案1
在 中bash
,这是一个很好的方法,是的。
source
使用or获取“库”脚本.
可以充分解决您想要在两个或多个脚本之间共享函数定义的问题。每个需要访问“库”脚本中定义的函数的脚本都会获取所需的文件,可能位于脚本的顶部。
这将允许您在单个“库”脚本中收集相关函数并获取它以访问它们。
并非完全无关,但bash
shell 还能够在执行非交互式 shell(即脚本)时自动获取文件。这可用于为脚本设置特定环境:
BASH_ENV="$HOME/stuff/script.env" ./myscript
... wherescript.env
可以做任何事情,从定义函数和设置 shell 或环境变量,到获取其他文件等。
某些 shell(例如ksh93
)具有指向可能包含此类函数定义脚本的目录的环境变量。在 中ksh93
,该变量称为FPATH
。脚本$FPATH/foo
会包含一个名为 的函数foo
,当用户foo
在命令行(或脚本中)键入时会自动找到该函数。据我所知, shellbash
不具有此特定功能。
其他 shell 具有其他形式的“自动加载”功能。
答案2
这个问题可能会被标记为主观,但我相信使用库来存储常用代码而不是每次都重新发明轮子是普遍接受的最佳实践。 source
定义函数和变量的脚本是执行此操作的 shell 方法,所以我会说是的,拥有库脚本并source
使用它们可能是一个很好的做法。
实际上,我更进一步,bin
在我的目录中有一个目录PATH
,其中包含我经常使用的工具和脚本;其中一些库脚本就在那里,因此我可以source
轻松地在交互式 shell 中使用它们。