#!/usr/bin/env bash
# Program:
# 打包程序生成自解压自运行文件
# History:
# 2020/03/25 [KibaAmor](https://kibazen.cn) Create this file
# 遇到错误时退出
set -e
# 配置
#################################################################
# 打包后可执行文件的名字
PACKAGE_NAME="server.run"
# 需要被打包程序的目录名(不要包含路径)
TARGET_DIR=server
# 被打包程序的可执行程序
EXEC_NAME="run.sh"
# 开始生成自解压的可执行程序
#################################################################
# 创建自解压脚本
cat > ${PACKAGE_NAME} << 'END'
#!/usr/bin/env bash
# Program:
# 打包目录'TARGET_DIR'生成自解压自运行的可执行文件
# History:
# CURRENT_DATETIME [KibaAmor](https://kibazen.cn) Create this file
# 遇到错误时退出
set -e
# 解压目录必须不存在
test -e TARGET_DIR && echo "'TARGET_DIR' already exist. Remove?" && rm -Ir TARGET_DIR
test -e TARGET_DIR && echo "'TARGET_DIR' is still exist. please remove manual" && exit -1
# 生成一个空的,用于解压文件的目录
mkdir TARGET_DIR
# 定位程序压缩后二进制数据在脚本中的位置
BIN_LINE_NUM=$(awk '/^__LAST_LINE__/ { print NR+1; exit 0; }' $0)
# 解压被打包的程序
tail -n +${BIN_LINE_NUM} $0 | tar -xz -C TARGET_DIR --strip-components=1
# 进入目录
cd TARGET_DIR
# 赋予可执行权限
chmod +x ./EXEC_NAME
# 开始执行被打包的程序
./EXEC_NAME $*
# 正常退出
exit 0
__LAST_LINE__
END
CURRENT_DATETIME=$(date +'%Y/%m/%d %H:%M:%S')
# 替换自解压脚本中的变量
sed -i "s/TARGET_DIR/${TARGET_DIR}/g" ${PACKAGE_NAME}
sed -i "s/EXEC_NAME/${EXEC_NAME}/g" ${PACKAGE_NAME}
sed -i "s@CURRENT_DATETIME@$(date +'%Y/%m/%d %H:%M:%S')@g" ${PACKAGE_NAME}
# 将打包的程序压缩,并将压缩后的二进制数据附加到自解压脚本后面
tar c ${TARGET_DIR} | gzip -f >> ${PACKAGE_NAME}
# 给自解压脚本执行权限
chmod +x ${PACKAGE_NAME}
# 输出信息
echo "打包成功. 打包后的文件为:${PACKAGE_NAME}"
# 正常退出
exit 0
上一篇
《设计模式》读书笔记
2020-04-03
下一篇
如何正确的学习设计模式
2020-03-14