在多个bash脚本中包含常用功能

时间:2019-11-01 17:49:09

标签: bash shell ubuntu-18.04

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

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

.bash_usr_functions中,有一堆用户定义的函数,例如:

function MyAmazingFunc()
{
    echo 1st param: $1
    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

这似乎可行,但非常小巧。采购.bash_usr_functions实际上会启动一个新的子bash进程并运行.bash_usr_functions中的任何代码!可以通过在文件中放入echo Hello from user functionsread VAR1之类的文件来验证这一点。

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

3 个答案:

答案 0 :(得分:2)

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

export -f MyAmazingFunc

请参阅:help export

答案 1 :(得分:1)

请注意,“。bashrc”仅对“交互式外壳”-登录外壳或使用(-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中调用其他函数,则这些函数也必须导出

答案 2 :(得分:0)

也许您可以使用BASH_ENV!
尝试将此行添加到您的.xsessionrc文件中。

  public synchronized boolean isEmpty()
    {
        return msgQ.isEmpty();
    }