在多个 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 functions
或 read 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"
使用 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 functions
或 read 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"