shell脚本实现可执行程序自动打包和部署的一种方式

1 篇文章 0 订阅
1 篇文章 0 订阅

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.执行过程

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

(2)tail -n +100 1.txt > 2.txt //将1.txt文件的第100开始到最后的内容,写入到2.txt中。

(3)cat install.sh xx.tar.gz >xxx.sh中,是将两个文件的内容写入到另外一个文件中,简单的堆叠。

(4)shell脚本中的$0、$1、$2....:用来表示参数,如执行pack.sh脚本时,其中的$0就是"pack.sh"这个名字本身;log_i "xxx",在log_i函数内部,$0为"log_i",$1为"xxx"。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值