如何为 Bash 构建可加载的内置函数

如何为 Bash 构建可加载的内置函数

正如我最近了解到的,可以将自定义内置函数动态加载到 Bash 中(请参阅enable在手册中, 和这个答案)。但是我不确定如何利用此功能。

链接的问题指向https://mywiki.wooledge.org/BashLoadableBuiltins它提供了一些编译指令,但我无法重现它们(在 Bash 5.0 中):

$ git clone https://git.savannah.gnu.org/git/bash.git
$ cd bash/
$ ./configure
$ make
$ exec ./bash
$ cd examples/loadables/
$ make
$ enable -f finfo finfo
bash: enable: cannot open shared object finfo: finfo: cannot open shared object file: No such file or directory

(这是满输出以防万一有帮助)

运行make似乎examples/loadables正在创建.o文件,而(我认为?)enable正在寻找.so文件。我是否错过了可以生成适当工件的步骤?是否有更简单或更典型的方法来构建自定义内置函数?

答案1

文件名必须是一条“绝对”路径(在这种情况下,这只是一个带有斜线的路径),或者它将在 中查找BASH_LOADABLES_PATH,回到 的dlopen(3)搜索机制(例如,请参阅 Linux 联机帮助页)。看来,尽管评论enable.def,这些不包括当前目录(IMO,这是一件好事)。

只需使用一个路径:

bash-5.0$ enable -f print print
bash: enable: cannot open shared object print: print: cannot open shared object file: No such file or directory
bash-5.0$ enable -f ./print print
bash-5.0$ help print
print: print [-Rnprs] [-u unit] [-f format] [arguments]
    Display arguments.

    Output the arguments.  The -f option means to use the argument as a
    format string as would be supplied to printf(1).  The rest of the
    options are as in ksh.

相关内容