# how-to-dispatch-c-lib-with-shell **Repository Path**: EEPPEE_admin/how-to-dispatch-c-lib-with-shell ## Basic Information - **Project Name**: how-to-dispatch-c-lib-with-shell - **Description**: a simple shell script that dispatch c lib - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-18 - **Last Updated**: 2026-04-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: shell ## README # NOTICE 1. ai generated code # 脚本完整解析 这是一个**自包含式 Shell 打包/提取工具脚本**(`/bin/sh` 兼容),核心作用是**把项目的 `include/` 和 `lib/` 目录打包嵌入到脚本自身中**,让脚本变成「单文件可分发」的工具;同时支持从脚本中提取目录、清理还原脚本,实现**脚本+资源一体化**。 ## 一、核心目的 1. **打包**:将当前项目的 `include/`(头文件)、`lib/`(库文件)目录压缩后,**直接追加到本脚本文件末尾**,让脚本自带资源文件。 2. **提取**:把嵌入在脚本里的 `include/`、`lib/` 解压到指定目录,还原原始文件结构。 3. **清理**:删除脚本中嵌入的所有资源数据,还原成干净的原始脚本。 4. **应用场景**:需要分发「脚本+配套库/头文件」的场景,无需单独打包资源,直接分发一个脚本文件即可。 --- ## 二、关键固定配置 ```sh MARKER="# __GEN_SIMPLE_PROJECT_BUNDLE__" # 数据分隔标记(脚本和二进制数据的分界线) SOURCE_DIRS="include/ lib/" # 固定要打包/提取的目录 ``` - `MARKER`:脚本的**分界线**,标记行以上是脚本代码,以下是打包的二进制数据。 - `SOURCE_DIRS`:写死了只处理 `include` 和 `lib` 两个目录,不可动态修改。 --- ## 三、核心函数详解 ### 1. `show_usage` 打印帮助信息,告诉用户脚本的用法、必选参数、可选参数,是标准的 Shell 脚本帮助函数。 ### 2. `check_bundle_source` 打包前的**校验函数**:检查当前目录下是否存在 `include/` 和 `lib/`,缺少任意一个就直接报错退出,保证打包合法性。 ### 3. `bundle_files`(核心:打包逻辑) 把目录压缩后**嵌入脚本自身**,步骤: 1. 复制脚本到临时文件,删除旧的打包数据(避免重复打包); 2. 保留脚本原始代码,追加分隔标记 `MARKER`; 3. 用 `tar` 压缩 `include/`、`lib/`,**给每一行数据加 `#` 前缀**(防止被 Shell 执行,保护二进制数据); 4. 把加密后的压缩数据追加到脚本末尾; 5. 清理临时文件,完成打包。 > 关键技巧:二进制数据加 `#` 前缀,Shell 会把它当成注释,不会执行,完美兼容脚本格式。 ### 4. `extract_files`(核心:提取逻辑) 从脚本中还原目录,步骤: 1. 检查目标目录是否存在,确认覆盖; 2. 找到脚本中的分隔标记行,**从标记行下一行开始读取数据**; 3. 去掉每一行的 `#` 前缀,还原原始 tar 压缩包; 4. 解压到指定目录,还原 `include/`、`lib/`。 ### 5. `clean_script`(核心:清理逻辑) 还原脚本为原始状态: 1. 找到分隔标记行; 2. 只保留**标记行及以上的脚本代码**,删除后面所有打包数据; 3. 覆盖原脚本,得到干净的工具脚本。 ### 6. `main` 脚本主入口: 1. 解析命令行参数(`--bundle`/`-o`/`--clean` 等); 2. 校验参数合法性(必须三选一); 3. 开启调试模式(`set -x`); 4. 根据参数调用对应核心函数(打包/提取/清理)。 --- ## 四、完整用法示例 ### 1. 打包目录到脚本 ```sh # 当前目录有 include/ 和 lib/,执行打包 ./脚本名.sh --bundle ``` 执行后,脚本文件体积变大,`include/`+`lib/` 已嵌入脚本末尾。 ### 2. 从脚本提取目录 ```sh # 提取到 ./my_project 目录 ./脚本名.sh -o ./my_project ``` 会在 `my_project/` 下生成 `include/` 和 `lib/`。 ### 3. 清理脚本,还原原始状态 ```sh ./脚本名.sh --clean ``` 删除脚本中所有打包数据,变回小巧的工具脚本。 ### 4. 查看帮助 ```sh ./脚本名.sh -h ``` --- ## 五、核心技术亮点 1. **自包含设计**:脚本自身既是工具,又是资源包,无需额外文件; 2. **数据安全**:二进制数据加 `#` 前缀,不会被 Shell 误执行; 3. **安全操作**:打包/清理都用临时文件备份,防止脚本损坏; 4. **跨平台兼容**:标准 `/bin/sh` 语法,Linux/macOS 通用。 --- ## 六、总结 1. **本质**:一个**自带资源打包/提取功能**的 Shell 工具,实现「脚本+项目文件」一体化; 2. **核心功能**:打包(嵌入目录)、提取(还原目录)、清理(还原脚本); 3. **适用人群**:需要分发带 `include`/`lib` 资源的脚本工具的开发者; 4. **核心原理**:用标记行分隔脚本代码和二进制数据,通过 `tar` 压缩+`#` 前缀保护数据。 # ref links - this is move out from: https://gitee.com/dasdot/shell-script-for-myself/tree/master/project-related