安装程序的原理与制作

2023-11-18

安装程序其实很简单,但却是很多软件特别是商业软件不可缺少的重要组成部分。在linux这个开源的世界中大部分软件都是源码发布的,下载下来一个configure+make+make install就完事了,在或者在不同平台上达成rpm或者deb的包,再或者是直接放到repo仓库中通过管理工具来更新打包。不过对于商业软件源码发表似乎很不现实,而受限于不同的发行版本的打包机制也不是商业软件的首选(当然也有很多软件更多的使用的是根据不同平台分别打包的方式)。那如何在linux上发布自己的商业软件呢?很多厂商的做法是发布一个bin文件。这个文件实现了不同平台下的自主安装的过程。

安装程序不过是安装内容组织的容器,说的简单一点就是一个压缩包,但是这个bin有解压的功能,并且自己有自己的配置系统和向导系统。而将压缩包解压是很简单的过程。如果我们的程序很简单,我们可以采用下面的方式来实现直接解压安装的功能:

  • 如果是在win下可以用winrar生成一个自解压文件的方式来做这样的简单的安装程序。
  • 如果是在linux下我们可以使用脚本来实现。
    #!/bin/bash
    INSTDIR=/default/install/path/
    
    ARCHIVE=`awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' $0`
    tail -n+$ARCHIVE $0 | tar xzv -C $TMPDIR
    CDIR=`pwd`
    cd $TMPDIR
    ./install $INSTDIR
    cd $CDIR
    rm -rf $TMPDIR
    exit 0
    __ARCHIVE_BELOW__
    
而如果我们的软件需要一些·配置,需要与客户有些交互,并且我们需要给用户一个相应的提示,那这个过程就是我们要实现的安装程序的过程。虽然linux的哲学是让程序自动化运行而不需要要人工干预他的过程,可是那些让windows给教坏的用户们还是希望有这样的一个人机交互系统的。

而交互界面实现有两种方式,一种是将GUI的安装程序静态编译以减少对外部系统的依赖;一种是采用shell脚本来实现。文件的基本结构都是一致的,前部是预处理程序和界面程序(或脚本),后半部分是我们经过压缩的实际要安装的内容。安装过程就是将后半部分解压缩,并移动到相应位置的过程。

如果在安装过程中或结束后需要做一些工作,直接在脚本中进行就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安装程序的原理与制作 的相关文章

  • 在 execl 在输出中不可见之前打印

    include
  • Linux shell 根据第二列对文件进行排序?

    我有一个这样的文件 FirstName FamilyName Address PhoneNumber 如何按 FamilyName 排序 如果这是 UNIX sort k 2 file txt 您可以使用多个 k用于对多列进行排序的标志 例
  • 如果文件没有行尾字符,则 wc -l 不计算文件的最后一个

    我需要计算 unix 文件的所有行数 该文件有 3 行 但是wc l仅给出 2 个计数 我知道它不计算最后一行 因为它没有行尾字符 任何人都可以告诉我如何计算这一行吗 grep c返回匹配行的数量 只需使用一个空字符串 作为您的匹配表达式
  • Xvfb 冻结初始化 GLX 扩展

    我正在尝试运行无头 Xvfb 服务器来捕获 Amazon EC2 micro 上的屏幕截图 但它在 GLX 上陷入了困境 我使用此脚本安装了 GLX Xvfb 和所有库 https gist github com joekiller 414
  • 如何从脚本编辑 /etc/sudoers?

    我需要编辑 etc sudoers从脚本中添加 删除白名单中的内容 假设我有一个可以处理普通文件的命令 我如何将其应用到 etc sudoers 我可以复制并修改它 然后有visudo用修改后的副本替换原始版本 通过提供我自己的脚本 EDI
  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • 应用程序中两个不同版本的库

    考虑一个场景 其中有两个不同版本的共享库 考虑 A 1 so 链接到 B so A 2 so 链接到 C so 现在 B so 和 C so 都链接到 d exe 当 B so 想要调用 A 1 so 中的函数时 它最终会调用 A 2 so
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • 在 Linux 中重新启动时,新创建的文件变为 0 kb(数据被覆盖为空)

    我遇到了一个奇怪的问题 这让我发疯 当前的任务是在 root 用户第一次登录时启动一组文件 并在同一用户第二次登录时启动另一组文件 我决定使用 profile 和 bashrc 文件 并在第一次登录期间发生的任务结束时重新加载 bashrc
  • bash 将输出重定向到文件,但结果不完整

    重定向命令输出的问题已经被问过很多次了 但是我有一个奇怪的行为 我使用的是 bash shell debian 版本 4 3 30 1 release 并尝试将输出重定向到文件 但并非所有内容都记录在文件中 我尝试运行的 bin 文件是 l
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • 来自守护程序的错误响应:加入会话密钥环:创建会话密钥:超出磁盘配额

    我尝试在我的服务器上安装 docker 使用本教程 https docs docker com install linux docker ce ubuntu 我想远程运行 docker 镜像并使用 portainer Web 界面来管理一切
  • 如何在线程创建和退出时调用函数?

    include
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in

随机推荐

  • 水下图像采集

    原文 http blog csdn net sunlinyi66 article details 50153875 NASA提供的雾天标准图像 这次终于找到了雾天处理图像来自哪里了 雾天图像 http dragon larc nasa go
  • 机器学习——朴素贝叶斯算法

    朴素贝叶斯算法 1 引言 2 朴素贝叶斯分类方法 3 概率基础 4 朴素贝叶斯特征提取 5 朴素贝叶斯分类的sklearn实现 6 垃圾短息分类 补充 1 引言 贝叶斯方法是一个历史悠久 有着坚实的理论基础的方法 同时处理很多问题时直接而又
  • django自动生成接口文档

    django自动生成接口文档 先pip安装coreapi包 配置 在urls py 在对应的serializers py文件设置备注 先pip安装coreapi包 pip install coreapi 小知识 这里不需要使用 导出pip所
  • 亚马逊云服务器aws配置ssl https证书

    文章目录 1 申请证书 1 1 搜索ssl 1 2 请求证书 1 3 请求共有证书 1 4 添加域名 1 5 选择验证方法 提交审核 等待大概10分钟 审核成功 2 配置证书 2 1 创建负载均衡器 2 2 选择https 2 3 配置负载
  • Qt创建一个自定义按钮

    1 概述 案例 编写一个自定义按钮 要求 1 给按钮添加自定义背景 2 监听按钮点击事件 2 代码案例 1 创建一个类让其继承QWidget 点击下一步下一步最后完成 2 打开MyPushButton 让其继承QPushButton 如下所
  • java 子线程 异常_Java子线程中的异常处理(通用)

    在普通的单线程程序中 捕获异常只需要通过try catch finally 代码块就可以了 那么 在并发情况下 比如在父线程中启动了子线程 如何在父线程中捕获来自子线程的异常 从而进行相应的处理呢 常见错误 也许有人会觉得 很简单嘛 直接在
  • 【数据结构】Binary Search Tree(BST) 二分搜索树

    数据结构源码 实现类 import java util import java util LinkedList import java util Queue import java util Stack 二分搜素树 BST param
  • Cannot resolve com.sun:tools:1.8

    问题描述 使用druid编译的时候说找不到这个包 解决过程 首先定位原因 通过pom可以找到对应的位置 报的是这个包找到不到 于是我也尝试着更换openjdk 但是还是不行 这两个包是在jdk当中的lib目录下 针对于这个问题一共有4个处理
  • 第十八天---IPV6

    链路聚合 可以将多个物理接口捆绑成一个逻辑接口 即将N条物理链路聚合为一条逻辑链路 可以在不升级硬件的条件下 达到增加带宽的效果 我们将逻辑链路 称为聚合链路 在华为设备中称为ETH TRUNK链路 这个技术是针对以太网技术设计的 我们将每
  • C语言-编译过程与内存分配

    一 编译过程 1 预编译 预处理 预处理过程实质上是处理 将 include包含的头文件直接拷贝到hell c当中 将 define定义的宏进行替换 同时将代码中没用的注释部分删除等 具体做的事儿如下 1 将所有的 define删除 并且展
  • 09 插件开发快速入门

    V5标准架构模型 V5平台基于三层模型开发 下面是相关架构图 建议认真阅读业务流向 入门 字符集 为了实现国际化编程 全局要求使用UTF 8的字符集编码 包括 数据库 参考安装维护手册配置字符集 文件 java properties jsp
  • Linux命令基础

    一 Linux命令新手 cd 意思是到上一级目录 cd 意思是返回到上次的目录 类似windows返回 cd 意思是回到根目录 1 增 使用mkdir 命令创建文件夹 先使用命令 cd home 意思是打开home目录 再使用命令 ls 意
  • oracle数据库 创建用户 并授权访问

    oracle数据库 创建用户 并授权访问 create user USER TEST 1 identified by USER TEST 1 创建用户 设置密码 grant connect to USER TEST 1 授权 连接 gran
  • 零经验也可以入职大厂吗,毕业生的第一份实习如何成功逆袭?

    很多小伙伴在找实习的时候都遇到了一个拷问灵魂深处的问题 第一次找实习 面试官嫌弃没有相关经验 应该怎么办 不管是刚回国的留学生还是没有经验的大二大三在校学生 在找实习的时候 很多企业连一个 第一次 的机会都不会给 在筛选简历时直接pass掉
  • Android实现支付宝支付遇到的问题记录--主要是和服务器的合作上

    一 已解决 1 客户端需要处理的很简单 跟服务器接口要带有签名的商品信息 即支付宝api需要的入参 2 服务器的联合排查工作 由于服务器工作较忙 需要联合定位 且自己对php不了解 过程比较头疼和耗时 主要出现两个问题 1 ALI64 解决
  • IOS开发笔记 - 基于wsdl2objc调用webservice

    为了方便在ios下调用webserivce 找来了wsdl2objc这样一个开源的框架来解析webservice方便在ios下引用 下面做个小例子 1 首先是用Asp net搭建一个测试的webserivce并放在IIS服务器上面 核心代码
  • Android篇——使用第三方视频框架GSYVideoPlayer时,报错:the sensor listeners size has exceeded the maximum limit 128

    背景 在列表 ListView RecyclerView 中使用GSYVideoPlayer播放视频时 闪退报错the sensor listeners size has exceeded the maximum limit 128 原因是
  • MySQL基础篇--自用笔记

    MySQL基础篇 数据库相关概念 名称 全称 简称 数据库 存储数据的仓库 数据是有组织的进行存储 DataBase DB 数据库管理系统 操纵和管理数据库的大型软件 DataBase Management System DBMS SQL
  • QT中使用 QProcess接口 执行 fmmpeg命令,实现简单的音视频处理

    QProcess 介绍 QProcess 是 Qt 框架中用于启动外部进程和与之进行交互的类 它提供了一个方便的接口 允许你执行外部命令并捕获其输出 错误信息以及监控其运行状态 通过使用 QProcess 类 你可以在你的 Qt 应用程序中
  • 安装程序的原理与制作

    安装程序其实很简单 但却是很多软件特别是商业软件不可缺少的重要组成部分 在linux这个开源的世界中大部分软件都是源码发布的 下载下来一个configure make make install就完事了 在或者在不同平台上达成rpm或者deb