1.背景
在实际项目中,除了需要将可执行程序复制到设备的对应目录中之外,可能需要将一些其它文件复制到对应目录,比如库文件、配置文件、证书等等,这些通过脚本来实现非常方便。常规的做法是将可执行程序和其它文件打包为一个tar.gz包,其中包含一个用于install的脚本。tar.gz包拷贝到设备中解压后,通过intall.sh来实现设备文件的部署。其中多了一次解压缩的工作,比较麻烦,这里介绍一种思路:
setp1.通过pack.sh将可执行程序和其它文件打包为tar.gz包
setp2.将install.sh的内容和tar.gz包的内容重定向到xxx.sh中
step3.在设备端运行xxx.sh脚本,实现升级包的自动部署。
2. pack.sh
其主要是在当前目录下创建一个project目录,在其下创建bin目录用于存放可执行程序,创建一个lib目录用于存放可执行程序依赖的动态库。然后将project整个目录打包为以当前时间命名的tar.gz包。最后再将install.sh和tar.gz的内容写入到一个以当前时间命名的脚本文件中。
#!/bin/bash
echo "===============Start packing=================="
function log_i(){
echo -e "\033[33m [ $1 ] \033[0m"
}
current_path=$(pwd)
log_i "current_path is:$current_path"
path=$current_path/project
if [ ! -d $path ]; then
mkdir -p $path
log_i "mkdir project path successful!"
fi
if [ ! -d $path ]; then
log_i "mdir project path error!"
exit 0
fi
bin_path=$path/bin
mkdir -p $bin_path
lib_path=$path/lib
mkdir -p $lib_path
cp $current_path/a.out $bin_path
cp $current_path/cal/*.so $lib_path
pack_time=$(date +%Y-%m-%d-%H-%M-%S)
tar zcvf $pack_time.tar.gz project
cat install.sh $pack_time.tar.gz >$pack_time.sh
log_i "==============Finish packing==============="
3. install.sh
这个脚本的主要功能是将其后面包含的tar.gz文件剥离出来,然后对齐解压,可以实现对可执行程序和库文件的拷贝安装。
#!/bin/bash
echo "===============Start installing=================="
function log_i(){
echo -e "\033[33m [ $1 ] \033[0m"
}
current_path=$(pwd)
log_i "current_path is:$current_path"
pos1=`grep -a -n "exit 0" $0 | sort -r | head -n 1 | cut -d : -f 1`
pos2=`expr $pos1 + 1`
echo "pos1=$pos1, pos2=$pos2"
#set tar.gz to path
tail -n +${pos2} $0 > $current_path/bin.tar.gz
tar zxf $current_path/*.tar.gz
chmod a+x $current_path/project/bin/a.out
exit 0
~
3.执行过程
![](https://i-blog.csdnimg.cn/blog_migrate/979a88d97d49c93a7dc0663ec87a672b.png)
4. 知识点说明
1.1 通过log_i演示了shell中函数的使用方式。脚本中定义为function的是函数,是需要被调用才会执行,其他的是按顺序执行。
1.2 关于grep、cut、sort命令的用法(可以参考https://www.cnblogs.com/security-guard/p/12264712.html)
(1)在$0所带边的文件中搜索"exit 0",然后列出按着倒序(sort -r)的方式list出的第一行(head -n 1),以自定义(-d)的分割符":"来分割这一行内容,取分隔符前的那部分(-f 1, -f和-d配合使用)
grep -r -n "exit 0" $0 |sort -r |head -n 1 |cut -d : -f 1
#-r 选项使其使用与二进制文件的搜索,否则会提示Binary file,无法grep
![](https://i-blog.csdnimg.cn/blog_migrate/d17b328d62b0530cf2d895635772d108.png)
(2)tail -n +100 1.txt > 2.txt //将1.txt文件的第100开始到最后的内容,写入到2.txt中。
(3)cat install.sh xx.tar.gz >xxx.sh中,是将两个文件的内容写入到另外一个文件中,简单的堆叠。
![](https://i-blog.csdnimg.cn/blog_migrate/4b0d65739c38fc4ba6c1459aad2549e1.png)
(4)shell脚本中的$0、$1、$2....:用来表示参数,如执行pack.sh脚本时,其中的$0就是"pack.sh"这个名字本身;log_i "xxx",在log_i函数内部,$0为"log_i",$1为"xxx"。