linux下自解压包制作

本文介绍了如何在Linux环境下制作自解压包,通过将执行脚本与压缩包合并,实现一步解压执行,简化部署升级过程。文章详细讲解了原理,并提供了具体的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要

在项目发布部署包或者升级包的时候, 往往是可执行文件和资源文件一起打包, 常规的方式是用tar制作压缩包, 然后在拷贝到目标机器, 解压,执行.

不过如果省去手动解压这一步, 直接执行升级包, 是不是更帅气一点

原理

  1. 将需要执行的脚本和升级包,用cat命令把两个文件拼到一起,如cat main.sh xx.pkg > yy.pkg
  2. 利用tar或者其他支持从标准输入读取压缩包的命令,用tail -n 压缩包内容的行数 ,把压缩包的内容输出给tar解压;如果解压缩的命令不支持从标准输入读取, 那么可以把tail命令的输出先保存起来,然后再执行解压缩
  3. 剩下的事情就是执行解压后的升级包里的命令,或者其他的shell命令

示例

main.sh 用于和升级包拼接到一起,如果升级包的类型不是tar.gz,只需要修改下解压缩升级包的代码即可

#!/bin/bash

CURR_DIR=$(realpath $(pwd))
EXTRACT_DIR=$CURR_DIR/.extract
MAIN_EXE=$EXTRACT_DIR/codes/main.sh


function main(){
    # 计算当前文件的总行数,以便可以把当前脚本的内容能和升级包的内容区别
    local total_lines=$(cat $0 | wc -l)
   # 因为wc -l 命令只能统计文件中的换行符的数目, 由于当前脚本要和压缩包拼接到一起, 因此最后一样末尾是不能有换行符的, 所以总行数需要+1
    ((total_lines++))
    # 利用__END__来表示脚本结束, 也可以使用其他的标记, 这里要计算出当前脚本的行数,用于计算拼接后的升级包内容的起始位置
    local code_lines=$(sed '/^# __END__$/q' $0 | wc -l)
    local pkg_lines=$((total_lines - code_lines))
    # 用于存放解压缩后的升级包
    rm -rf $EXTRACT_DIR && mkdir $EXTRACT_DIR
    # 把升级包的内容取出用tar命令解压,这里视压缩包的类型而定
     tail -n $pkg_lines $0 | tar -xz -C $EXTRACT_DIR
    # 执行升级命令, 视具体的代码结构而定, 这里升级包已经解压成功了 
    # 剩余的脚本就是去执行升级命令, 或者做其他的事情, 就是普通的shell脚本内容了
    chmod +x $MAIN_EXE
    $MAIN_EXE

    return 0
 }

main $@
# 一定要退出脚本, 因为后面的内容就是升级包的内容了
exit $?
# do not append newline or anything after __END__
# __END__
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值