如何在一行中导出一个文件中的所有 Bash 函数?

如何在一行中导出一个文件中的所有 Bash 函数?

在 Ubuntu 16.04 中,我有一个 Bash 文件,其中包含一些不同的函数,用于在我的系统上自动执行各种常见任务。

我已经获取了该文件,bashrc这样我就可以在需要时轻松地从终端中的任何位置调用每个函数,因此我们可以说“函数本身是获取的”。

有时我需要使用这些源函数之一从脚本内部,我需要古板的此操作与:

export -f myFunc_0 myFunc_1 myFunc_2 ...

否则我将无法使用这些功能。


我怎样才能做到这一点全部文件中的函数,而不注明具体函数?

答案1

如果您set -a在函数文件本身.bashrc或函数文件本身中使用,它将标记所有要导出的函数。

4.3.1 内置集合

-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,然后可以从其他地方获取。

相关内容