在多个 bash 脚本中包含常用函数

Include common functions in multiple bash scripts

使用 Ubuntu 18.04。我的 .bashrc 文件包含以下行:

if [ -f ~/.bash_usr_functions ]; then
    . ~/.bash_usr_functions
fi

.bash_usr_functions中有一堆用户自定义函数如:

function MyAmazingFunc()
{
    echo 1st param: 
    echo Function body is complex...omitted for brevity
}

现在,无论何时启动新的 Linux 终端,键入 MyAmazingFunc 37 都会按预期工作。太棒了!

现在我写了一个新的 bash 脚本。此脚本想了解并使用 AmazingFunc。我原以为使用此代码会自动执行此操作:

#!/bin/bash
AmazingFunc 37

但是当我 运行 使用 bash ./NewScript.sh 时出现错误:Command 'MyAmazingFunc' not found.

因此,我修改了 NewScript.sh 以包含来自 .bashrc:

的相同行
if [ -f ~/.bash_usr_functions ]; then
    . ~/.bash_usr_functions
fi

这似乎可行,但非常不优雅。 Sourcing .bash_usr_functions 实际上启动了一个新的子 bash 进程和 运行s .bash_usr_functions 中的任何代码!这可以通过在该文件中放入类似 echo Hello from user functionsread VAR1 的内容来验证。

是否有更好的方法将您自己的用户函数包含在代码库(即许多脚本)中,而不必将整个函数复制到每个 bash 脚本或使用 source

将此添加到您的 ~/.bashrc 以将您的函数导出到随后执行的命令的环境中:

export -f MyAmazingFunc

参见:help export

请注意,'.bashrc' 仅在 'interactive shell' - 登录 shell 或使用 (-i) 时执行。如果您希望能够在其他上下文中 运行 您的 'NewScript.sh',请考虑使用 'include guard' 进行替代实施。这将删除对登录 shell.

的依赖

在NewScript.sh

[ "$user_functions_loaded" ] || source ~/.bash_usr_functions

在~/.bash_usr_functions

user_functions_loaded=1
func AmazingFunc ...

这种方法消除了导出单个函数的需要 - 回想一下,如果 'MyAmazingFunc' 正在调用 ~/.bash_usr_functions 中的其他函数,那么也必须导出这些函数

也许你可以使用 BASH_ENV!
尝试在您的 .xsessionrc 文件中添加这一行。

export BASH_ENV="$HOME/.bash_usr_functions"