脚本概述
由于某些sdk或软件依赖众多的第三方库,而从官网下载到windows主机或从linux传到windows时,所依赖的so库往往丢失符号链接,给编译运行带来不便,因此编写了ctlsolink脚本,用于自动为单个so或某目录下的众多so或创建/删除一级/二级符号链接。该脚本的用法如下:
● 第1参数为mk或rm子命令,mk表示创建,rm表示删除
● 第2参数为文件或目录
● 第3参数是可选的-r,且只能是-r,如果指定了,则表示不断递归子目录
脚本实现
考虑到so库带版本一般多为libx.so.1,libx.so.1.2,libx.so.1.2.3这三种形式(x为库名),对于前一种创建/删除一级符号链接即可,后两种则创建/删除二级符号链接。为了精确地抽出一级和二级链接名称,这里使用awk来匹配,用shell变量的最短匹配模式从尾部逐步删除点号及数字,核心代码如下
要注意的是,这儿不能使用%%删除最长匹配的尾部来得到link_name,因为它的模式是.[0-9]*,这可能会错误地匹配了so前的部分,比如libx.1.so.2得到libx,而期望的是libx.1.so
完整脚本下载:ctlsolink
运行效果
初始状态
![]()
运行ctlsolink创建软链接后
![]()
运行ctlsolink删除软链接后
![]()
由于某些sdk或软件依赖众多的第三方库,而从官网下载到windows主机或从linux传到windows时,所依赖的so库往往丢失符号链接,给编译运行带来不便,因此编写了ctlsolink脚本,用于自动为单个so或某目录下的众多so或创建/删除一级/二级符号链接。该脚本的用法如下:
● 第1参数为mk或rm子命令,mk表示创建,rm表示删除
● 第2参数为文件或目录
● 第3参数是可选的-r,且只能是-r,如果指定了,则表示不断递归子目录
脚本实现
考虑到so库带版本一般多为libx.so.1,libx.so.1.2,libx.so.1.2.3这三种形式(x为库名),对于前一种创建/删除一级符号链接即可,后两种则创建/删除二级符号链接。为了精确地抽出一级和二级链接名称,这里使用awk来匹配,用shell变量的最短匹配模式从尾部逐步删除点号及数字,核心代码如下
1
if [ "$dir" != "$self_dir" ] || [ "$name" != "$self_name" ]; then
2
if echo $name | awk '{if($0~/\.so\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}$/) exit 0; else exit 1}'; then
3
link_name=${name%.[0-9]*}
4
link_name=${link_name%.[0-9]*}
5
link_name=${link_name%.[0-9]*}
6
link_name2=${name%.[0-9]*}
7
link_name2=${link_name2%.[0-9]*}
8
elif echo $name | awk '{if($0~/\.so\.[0-9]{1,}\.[0-9]{1,}$/) exit 0; else exit 1}'; then
9
link_name=${name%.[0-9]*}
10
link_name=${link_name%.[0-9]*}
11
link_name2=${name%.[0-9]*}
12
elif echo $name | awk '{if($0~/\.so\.[0-9]{1,}$/) exit 0; else exit 1}'; then
13
link_name=${name%.[0-9]*}
14
else
15
return
16
fi
17![]()
18
if [ $do_mk = "yes" ]; then
19
#echo "name=$name, link_name=$link_name, link_name2=$link_name2"
20
if [ -n "$link_name2" ]; then
21
ln -sf $name $link_name2
22
ln -sf $link_name2 $link_name
23
else
24
ln -sf $name $link_name
25
fi
26
else
27
if [ -n $link_name2 ]; then
28
rm -f $link_name2
29
fi
30
rm -f $link_name
31
fi
32
fi

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

完整脚本下载:ctlsolink
运行效果
初始状态

运行ctlsolink创建软链接后

运行ctlsolink删除软链接后
