2023-01-20 380
我认为这个问题很容易,对于您的外壳编写怪物.
我正在寻找通过bash shell脚本来创建指向UNIX共享库的符号链接的最优雅和最短的方法.
我需要的是从共享库文件的列表开始,例如” libmythings.so.1.1,libotherthings.so.5.11″,获取创建的符号链接,例如:
libmythings.so -> libmythings.so.1 -> libmythings.so.1.1
libotherthings.so -> libotherthings.so.5 -> libotherthings.so.5.11
库文件在一个包含其他文件(例如其他shell脚本)的目录内.
编辑:嗯,” ldconfig -nn”.可以正常工作,但是我也需要链接,而没有大量库在” .so”之后的库,至少一个库,因为一个或多个库是JAVA的JNI调用点,因此当库时通过system.loadlibrary(” libraryname”)进行实例化,它期望一个名为” libraryname.so”的库,而不是” libraryname.so.x”.
如果有Java部件有解决方法,则仅使用LDCONFIG -NN的解决方案可以工作.
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
当心 – 未经测试的代码.
hubris先于克星.
评论到上面的代码不起作用 – 评论是正确的.固定版本的原位测试是:
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脚本的点:在a的条件块中的操作顺序不需要是一个命令.通过编辑操作的行状态并不影响整个测试是否成功;最后一个命令的退出状态” [ -n “$extn” ]”控制循环是否继续.
我相信ldconfig是这样做的标准工具.
我记得在某个地方可以根据内部版本信息生成符号链接,但现在找不到源.
编辑是的,如果您运行
ldconfig -v
您会看到它基于库内部生成所有链接.
ldconfig /path/to/dir
将仅创建文件的链接
笔记,我玩过它,它似乎并不始终创建.So $,Just .so.{Mapar}
我不确定它的内部如何工作,但我确实知道:
lib # rm libmagic.so
lib # rm libmagic.so.1
lib # ldconfig
lib # file libmagic.so.1
libmagic.so.1: symbolic link to `libmagic.so.1.0.0'
lib # file libmagic.so
libmagic.so: cannot open `libmagic.so' (No such file or directory)
所以什么决定这项工作的方法对我来说是个谜
编辑在进一步的盘点后,.la文件对行为没有影响.
” so”名称字段指示符号链接的调用.
,只有一个.
0x00000000000000000e(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
以上所述是小编给大家介绍的用Bash脚本来创建共享库的符号链接,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25951.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态