如何或在何处定义在 bash、zsh、sh 脚本中使用的全局函数?

如何或在何处定义在 bash、zsh、sh 脚本中使用的全局函数?

假设我有以下三个脚本文件:(所有三个都是可执行的)

bash-测试.sh:

#!/bin/bash
HelloFromBash RocketNuts

zsh-测试.sh:

#!/bin/zsh
HelloFromZsh RocketNuts

sh-测试.sh:

#!/bin/sh
HelloFromSh RocketNuts

从shebangs中可以看出,这些脚本分别由不同的shell执行bash,即zsh、和sh

这三个函数“HelloFromXyz”都应该像这样定义:
function HelloFromBash { echo "Hello $1, this is Bash speaking" }
对于 zsh 和 sh 变体也是如此。

但问题是:我想要全局定义这些函数,每个特定的 shell 一个。

如何或者在哪里为这三个 shell 定义全局函数?这样,当我运行上述三个脚本时,它们各自都可以使用该 shell 的特定全局函数。

如果有一种统一的方法来同时为多个 shell 定义(或导出,或任何适当的术语)全局函数,那就更好了。但我相信事实并非如此,每个 shell 似乎都使用自己的机制。

(编辑) 我理解,无论是交互式 shell 还是登录 shell,可能会有所不同。我希望该函数在 shell 脚本中可用全部情况。因此,我可以手动打开终端,并运行使用所述全局函数的脚本。或者,我可以运行调用相同 shell 脚本的后台进程。
如果这需要在多个文件中定义或导出相同的函数,或者在另一个文件中包含/获取一个函数,我很乐意了解详细信息。

答案1

如果您想定义一个函数“库”以在脚本中使用,请将它们写入在使用该函数的脚本中“源”的文件中:

“库”文件:

function the_function {
    # whatever
}

用法:

# include the library
source /path/to/the/library # You can also use ". /path/to/the/library"

# Or, of caller and library are in the same directory
source $(dirname "$0")/library 

# Call the function in it
the_function arg1 arg2

该库文件不需要是可执行文件,也不需要 shebang,因此如果编码得当,它可以被 bash 和 ksh(也许还有 zsh)使用。

相关内容