- ai generated code
这是一个自包含式 Shell 打包/提取工具脚本(/bin/sh 兼容),核心作用是把项目的 include/ 和 lib/ 目录打包嵌入到脚本自身中,让脚本变成「单文件可分发」的工具;同时支持从脚本中提取目录、清理还原脚本,实现脚本+资源一体化。
- 打包:将当前项目的
include/(头文件)、lib/(库文件)目录压缩后,直接追加到本脚本文件末尾,让脚本自带资源文件。 - 提取:把嵌入在脚本里的
include/、lib/解压到指定目录,还原原始文件结构。 - 清理:删除脚本中嵌入的所有资源数据,还原成干净的原始脚本。
- 应用场景:需要分发「脚本+配套库/头文件」的场景,无需单独打包资源,直接分发一个脚本文件即可。
MARKER="# __GEN_SIMPLE_PROJECT_BUNDLE__" # 数据分隔标记(脚本和二进制数据的分界线)
SOURCE_DIRS="include/ lib/" # 固定要打包/提取的目录MARKER:脚本的分界线,标记行以上是脚本代码,以下是打包的二进制数据。SOURCE_DIRS:写死了只处理include和lib两个目录,不可动态修改。
打印帮助信息,告诉用户脚本的用法、必选参数、可选参数,是标准的 Shell 脚本帮助函数。
打包前的校验函数:检查当前目录下是否存在 include/ 和 lib/,缺少任意一个就直接报错退出,保证打包合法性。
把目录压缩后嵌入脚本自身,步骤:
- 复制脚本到临时文件,删除旧的打包数据(避免重复打包);
- 保留脚本原始代码,追加分隔标记
MARKER; - 用
tar压缩include/、lib/,给每一行数据加#前缀(防止被 Shell 执行,保护二进制数据); - 把加密后的压缩数据追加到脚本末尾;
- 清理临时文件,完成打包。
关键技巧:二进制数据加
#前缀,Shell 会把它当成注释,不会执行,完美兼容脚本格式。
从脚本中还原目录,步骤:
- 检查目标目录是否存在,确认覆盖;
- 找到脚本中的分隔标记行,从标记行下一行开始读取数据;
- 去掉每一行的
#前缀,还原原始 tar 压缩包; - 解压到指定目录,还原
include/、lib/。
还原脚本为原始状态:
- 找到分隔标记行;
- 只保留标记行及以上的脚本代码,删除后面所有打包数据;
- 覆盖原脚本,得到干净的工具脚本。
脚本主入口:
- 解析命令行参数(
--bundle/-o/--clean等); - 校验参数合法性(必须三选一);
- 开启调试模式(
set -x); - 根据参数调用对应核心函数(打包/提取/清理)。
# 当前目录有 include/ 和 lib/,执行打包
./脚本名.sh --bundle执行后,脚本文件体积变大,include/+lib/ 已嵌入脚本末尾。
# 提取到 ./my_project 目录
./脚本名.sh -o ./my_project会在 my_project/ 下生成 include/ 和 lib/。
./脚本名.sh --clean删除脚本中所有打包数据,变回小巧的工具脚本。
./脚本名.sh -h- 自包含设计:脚本自身既是工具,又是资源包,无需额外文件;
- 数据安全:二进制数据加
#前缀,不会被 Shell 误执行; - 安全操作:打包/清理都用临时文件备份,防止脚本损坏;
- 跨平台兼容:标准
/bin/sh语法,Linux/macOS 通用。
- 本质:一个自带资源打包/提取功能的 Shell 工具,实现「脚本+项目文件」一体化;
- 核心功能:打包(嵌入目录)、提取(还原目录)、清理(还原脚本);
- 适用人群:需要分发带
include/lib资源的脚本工具的开发者; - 核心原理:用标记行分隔脚本代码和二进制数据,通过
tar压缩+#前缀保护数据。
- this is move out from: https://gitee.com/dasdot/shell-script-for-myself/tree/master/project-related