linux 制作一个自解压文件

Linux 下的 .run 自执行安装包(适配 ROS Noetic 等场景),核心思路是将安装脚本、待安装文件打包成「自解压 shell 脚本」 ------ 本质是把「解压逻辑 + 自定义安装逻辑」写到一个脚本里,最终生成可执行的 .run 文件。下面给出通用、可落地的制作步骤

一、核心原理(通俗理解)

.run 文件 = 自解压脚本 + 压缩的安装文件(二进制/配置/依赖)

运行 .run 时,脚本先自动解压内部文件,再执行你写的安装逻辑(复制文件、配置环境、创建快捷方式等),全程无需手动解压。

二、制作步骤(分 4 步,ROS 场景示例)

以「制作一个 ROS 工具的 .run 安装包」为例,假设待安装的内容是:

工具二进制文件:~/ros_tool/bin/my_ros_tool

配置文件:~/ros_tool/config/tool_config.yaml

安装脚本:install.sh(自定义安装逻辑)

步骤 1:整理安装文件结构

先把所有待安装的文件 / 脚本放到一个统一目录,方便打包:

cpp 复制代码
 # 创建工作目录
mkdir -p ~/ros_run_builder/{src,dist}
# src:存放待安装的文件+安装脚本;dist:存放最终生成的.run文件
cd ~/ros_run_builder/src

# 复制待安装文件到src目录(按你的实际路径修改)
cp -r ~/ros_tool/bin ./
cp -r ~/ros_tool/config ./

# 创建核心安装脚本 install.sh(关键!自定义安装逻辑)
vim install.sh

写入以下安装逻辑(适配 ROS Noetic,可按需修改):

cpp 复制代码
#!/bin/bash
# install.sh - ROS 工具安装脚本
set -e  # 出错立即退出

# 定义安装路径(可让用户自定义,这里默认安装到 /opt/ros/noetic/tools)
INSTALL_DIR="/opt/ros/noetic/tools"
echo "开始安装 ROS 工具到:$INSTALL_DIR"

# 1. 创建安装目录
mkdir -p $INSTALL_DIR/{bin,config}

# 2. 复制文件到安装目录
cp -r bin/* $INSTALL_DIR/bin/
cp -r config/* $INSTALL_DIR/config/

# 3. 添加可执行权限
chmod +x $INSTALL_DIR/bin/my_ros_tool

# 4. 配置 ROS 环境(可选,让用户无需手动配)
echo "export PATH=\$PATH:$INSTALL_DIR/bin" >> ~/.bashrc
echo "export ROS_TOOL_CONFIG=$INSTALL_DIR/config/tool_config.yaml" >> ~/.bashrc

# 5. 提示安装完成
echo "✅ ROS 工具安装完成!执行 source ~/.bashrc 生效环境变量"

步骤 2:编写自解压脚本(核心模板)

在 ~/ros_run_builder/src 目录下创建 self_extract.sh(自解压核心逻辑):

cpp 复制代码
vim self_extract.sh

写入通用自解压模板(无需修改,直接复用):

cpp 复制代码
#!/bin/bash
# self_extract.sh - 自解压脚本模板
set -e

# 1. 定义分隔符(必须唯一,建议用随机长字符串)
DELIMITER="=====ROS_RUN_DELIMITER_2026====="

# 2. 解压逻辑:找到分隔符位置,解压后面的压缩内容
ARCHIVE_START=$(awk "/^$DELIMITER$/ {print NR + 1; exit}" $0)
tail -n +$ARCHIVE_START $0 | tar zxvf -

# 3. 进入解压后的目录,执行安装脚本
cd ./ros_tool_files
chmod +x install.sh
./install.sh

# 4. 清理临时文件(可选)
cd ..
rm -rf ./ros_tool_files

# 5. 结束
echo "📦 安装包执行完成!"
exit 0

# 分隔符(必须单独一行)
$DELIMITER

步骤 3:打包生成 .run 文件

将「自解压脚本 + 压缩的安装文件」合并,生成最终的 .run 文件:

cpp 复制代码
cd ~/ros_run_builder/src

# 1. 压缩待安装文件(包括install.sh)到 tar.gz 包
tar zcf ros_tool_files.tar.gz bin/ config/ install.sh

# 2. 合并自解压脚本 + 压缩包 → 生成.run文件
cat self_extract.sh ros_tool_files.tar.gz > ../dist/ros_tool_install.run

# 3. 赋予.run文件执行权限
chmod +x ../dist/ros_tool_install.run

# 最终生成的安装包路径:~/ros_run_builder/dist/ros_tool_install.run

步骤 4:测试 .run 安装包

cpp 复制代码
# 切换到dist目录,运行安装包
cd ~/ros_run_builder/dist
./ros_tool_install.run

# 验证安装结果
source ~/.bashrc
my_ros_tool --version  # 能执行则说明安装成功
相关推荐
黄昏晓x6 分钟前
Linux----缓冲区
linux·运维·服务器
2501_9011478310 分钟前
学习笔记:单调递增数字求解的迭代优化与工程实践
linux·服务器·笔记·学习·算法
似霰17 分钟前
Linux timerfd 的基本使用
android·linux·c++
2501_9248787328 分钟前
AdAgent 能力成熟度模型:从 L1 自动化到 L5 自主增长引擎
运维·自动化
寄存器漫游者30 分钟前
Linux 软件编程 命令、内核与 Shell
linux·运维·服务器
Kaede61 小时前
服务器硬件防火墙和软件防火墙的区别
运维·服务器
qinyia1 小时前
通过本地构建解决Cartographer编译中absl依赖缺失问题
linux·运维·服务器·mysql·ubuntu
郝亚军1 小时前
ubuntu启一个udp server,由一个client访问
linux·ubuntu·udp
苦逼IT运维1 小时前
从 0 到 1 理解 Kubernetes:一次“破坏式”学习实践(一)
linux·学习·docker·容器·kubernetes
萧曵 丶1 小时前
Docker 面试题
运维·docker·容器