正如我最近了解到的,可以将自定义内置函数动态加载到 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.