Bash脚本创build符号链接到共享库

我认为这个问题对于你的shell脚本怪物是相当容易的。

我正在寻找最优雅和最简单的方式来创build符号链接到Unix的共享库通过bash shell脚本。

我需要的是从“libmythings.so.1.1,libotherthings.so.5.11”等共享库文件列表开始,获取创build的符号链接,例如:

libmythings.so -> libmythings.so.1 -> libmythings.so.1.1 libotherthings.so -> libotherthings.so.5 -> libotherthings.so.5.11 

库文件位于包含其他文件(如其他shell脚本)的目录中。

编辑 :好,“ldconfig -nN”。 可以正常工作,但是我还需要链接,没有在“.so”之后附加的库的主要编号,至less有一个库,因为一个或多个库是来自Java的JNI调用的入口点,所以当一个库通过System.loadlibrary(“libraryname”)的方式实例化,它期望一个名为“libraryname.so”的库,而不是“libraryname.so.X”。

只有ldconfig -nN的解决scheme可以工作,如果有Java部分的解决方法。

Solutions Collecting From Web of "Bash脚本创build符号链接到共享库"

 for baselib in "$@" do shortlib=$baselib while extn=$(echo $shortlib | sed 's/\.[0-9][0-9]*$//') [ -n "$extn" ] do shortlib=$(basename $shortlib $extn) ln -s $baselib $shortlib done done 

我欺骗了 – 所有的链接去基础库(libmythings.so.1.1); 如果你真的想链,那么你需要:

 for baselib in "$@" do shortlib=$baselib while extn=$(echo $shortlib | sed 's/\.[0-9][0-9]*$//') [ -n "$extn" ] do shorterlib=$(basename $shortlib $extn) ln -s $shortlib $shorterlib shortlib=$shorterlib done done 

当心 – 未经测试的代码。


傲慢先于克星。

评论到达,上面的代码不起作用 – 和评论是正确的。 现场测试的固定版本是:

 set -- libname.so.5.1.1 for baselib in "$@" do shortlib=$baselib while extn=$(echo $shortlib | sed -n '/\.[0-9][0-9]*$/s/.*\(\.[0-9][0-9]*\)$/\1/p') [ -n "$extn" ] do shortlib=$(basename $shortlib $extn) echo ln -s $baselib $shortlib done done 

这个改变在sed命令中。 此版本默认情况下不打印任何内容( -n ),只匹配以小数点后跟数字结尾的行,然后删除除后缀之外的所有内容,并打印剩余分配给extn的内容。 经修改,脚本生成下面的输出。 删除回声让它执行链接命令。

 ln -s libname.so.5.1.1 libname.so.5.1 ln -s libname.so.5.1.1 libname.so.5 ln -s libname.so.5.1.1 libname.so 

脚本说明了一个有趣的,经常被忽略的关于shell脚本的地方:在一段时间的条件块中的操作序列不需要是单个命令。 具有编辑操作的行的状态不会影响测试是否成功; 最后一个命令的退出状态“ [ -n "$extn" ] ”控制循环是否继续。

我相信ldconfig是这样做的标准工具。

我记得它可以根据内部版本信息生成符号链接,但是现在找不到源代码。

编辑是的,如果你跑

 ldconfig -v 

你会看到它生成所有基于库内部的链接。

 ldconfig /path/to/dir 

只会创建该目录中的文件的链接

但是我注意到了它,似乎并没有一贯创建.so $,只是.so。{major}

我不确定它的内部是如何工作的,但是我知道:

 lib#rm libmagic.so
 lib#rm libmagic.so.1
 lib#ldconfig 
 lib#文件libmagic.so.1   
 libmagic.so.1:到`libmagic.so.1.0.0'的符号链接
 lib#文件libmagic.so 
 libmagic.so:无法打开libmagic.so(没有这样的文件或目录)

那么决定如何运作对我来说是一个谜

编辑后进一步discetion,.la文件没有行为的影响。

“SO”名称字段表示符号链接将被调用。

而且只会有一个。

0x000000000000000e(SONAME)库soname:[libmagix.so]

这是黑客代码并用空格替换“.1”之后。

ldconfig生成“libmagic.so”(是的,包括空格)

来自Jonathan Leffler的脚本(我在〜/ bin中添加了一个名为'liblinks'的脚本)

 #!/bin/bash # liblinks - generate symbolic links # given libx.so.0.0.0 this would generate links for libx.so.0.0, libx.so.0, libx.so # # By adding sudo to the ls command, we get permission to do the linking (or get an empty list) LIBFILES=`sudo ls lib*.so.*` for FILE in $LIBFILES; do echo $FILE shortlib=$FILE basename=$FILE while extn=$(echo $shortlib | sed -n '/\.[0-9][0-9]*$/s/.*\(\.[0-9][0-9]*\)$/\1/p') [ -n "$extn" ] do shortlib=$(basename $shortlib $extn) sudo ln -fs $basename $shortlib basename=$shortlib done done