在 Ubuntu 16.04 中,我有一个 Bash 文件,其中包含一些不同的函数,用于在我的系统上自动执行各种常见任务。
我已经获取了该文件,bashrc
这样我就可以在需要时轻松地从终端中的任何位置调用每个函数,因此我们可以说“函数本身是获取的”。
有时我需要使用这些源函数之一从脚本内部,我需要古板的此操作与:
export -f myFunc_0 myFunc_1 myFunc_2 ...
否则我将无法使用这些功能。
我怎样才能做到这一点全部文件中的函数,而不注明具体函数?
答案1
如果您set -a
在函数文件本身.bashrc
或函数文件本身中使用,它将标记所有要导出的函数。
-A
创建或修改的每个变量或函数都被赋予导出属性,并标记为导出到后续命令的环境。
如果您设置不想导出的变量,这可能会导致一些不良结果,但您可以将如下内容添加到您的.bashrc
:
set -a
source ~/my_funcs
set +a
答案2
您真正应该做的是获取包含脚本本身内部函数的文件,这样它就不会依赖于上下文(或者更确切地说,它将较少依赖于上下文)。
答案3
你可以尝试这样的事情:
declare -fx $(bash -c 'source /path/to/my-file &> /dev/null; compgen -A function')
由于您只想从文件中导出函数,因此在 bash 的新实例中获取它,然后使用compgen -A function
将列出该文件中定义的所有函数的名称(以及之前导出的函数,但这在这里应该不是问题) 。然后您可以将其输出与export -f
或一起使用declare -fx
来导出这些函数。
当您在 bashrc 中获取文件时,重新获取它可能不会成为问题。
答案4
的输出set
似乎已排序,有利于提取所有定义的函数。它从变量开始,然后显示函数,soes:
set |awk '/^[^=()]*\(\)/ {functions=1} functions' > functions.sh
这会查找第一个非赋值(在()
第一个之前出现=
),然后说可以打印。当变量functions
为 true 时,第二个 awk 节使用默认打印操作。输出保存在 中functions.sh
,然后可以从其他地方获取。