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  # 能执行则说明安装成功
相关推荐
蜡笔小炘8 分钟前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
生活很暖很治愈17 分钟前
Linux——孤儿进程&进程调度&大O(1)调度
linux·服务器·ubuntu
HalvmånEver33 分钟前
Linux:线程同步
linux·运维·服务器·线程·同步
喵叔哟34 分钟前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
Zach_yuan36 分钟前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
岁杪杪39 分钟前
关于运维:LINUX 零基础
运维·服务器·php
wdfk_prog1 小时前
[Linux]学习笔记系列 -- [drivers][I2C]I2C
linux·笔记·学习
VekiSon1 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
tianyuanwo1 小时前
企业级NTP客户端配置指南:基于内部NTP服务器的实践
运维·服务器·ntp客户端
芷栀夏1 小时前
CANN开源实战:基于DrissionPage构建企业级网页自动化与数据采集系统
运维·人工智能·开源·自动化·cann