LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1527|回复: 8

制作run程序安装包

[复制链接]
发表于 2006-3-17 18:35:24 | 显示全部楼层 |阅读模式
这两天要做一个非正式的公司内部的安装包,决定采用像许多驱动用的run安装包,依照我的理解写了一个小小的解释。不对之处,请大家指正:

run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:

  1. |-----------------|
  2. |                 |
  3. |     安装脚本    |
  4. |                  |
  5. |-----------------|
  6. |                 |
  7. |      程序      |
  8. |                 |
  9. |-----------------|
  10. 图: run安装包的结构
复制代码

这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。
制作run安装包以下举个实际的例子:
为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。
[PHP]$ ls
install.sh helloworld
$ cat install.sh
#!/bin/bash
cp helloworld /bin
$[/PHP]
现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:
$ tar jcvf helloworld.tar.bz2 helloworld
现在修改一个安装脚本install.sh
改为:
[PHP]#!/bin/bash
lines=7      #这个值是指这个脚本的行数加1,这个脚本共有6行
tail +$lines $0 >/tmp/helloworld.tar.bz2 # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.bz2文件里。
tar jxvf /tmp/hellowrold.tar.bz2
cp helloworld /bin
exit 0
[/PHP]
然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。
$ cat install.sh helloworld.tar.bz2 > myinstall.run
这样就得到了myinstall.run文件,它的结构如下:
  1. |-----------------------| 第1行
  2. |                       |
  3. |    install.sh         |
  4. |                       | 第6行
  5. |-----------------------|
  6. |                       | 第7行
  7. |helloworld.tar.bz2     |
  8. |                       |
  9. |-----------------------| 结尾
  10. 图: myinstall.run安装包的结构
复制代码


运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据(即helloworld.tar.bz2文件),而我们用了tail巧妙地把第7行以下的数据重新生成了一个helloworld.tar.gz文件。再执行安装。

run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。

附注:
终极幻想兄弟补了一个技巧:
在调试run安装脚本时,把上面脚本的lines变量硬编码进去会导致很多不方便,可在脚本末尾设置一个标志来自动计算安装脚本的行数。方法自然是五花八门的,我这儿写了一个,以供参考。
增加后的脚本变成了下面的样子:
[PHP]#!/bin/bash
lines=$(grep -an "^#\{3\}$" $0 | cut -d: -f1)
#上面的语句计算3个#字符为一行的标志行所在的行数,标志行就是这个脚本的最后一行
let "lines++"               #增一行指到二进制数据所在的行
tail +$lines $0 >/tmp/helloworld.tar.bz2 # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.bz2文件里。
tar jxvf /tmp/hellowrold.tar.bz2
cp helloworld /bin
exit 0

#######下面这一行是标志行########
###
[/PHP]
发表于 2006-3-17 18:43:39 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2006-3-20 12:53:30 | 显示全部楼层
这里有个错误:
[php]
#!/bin/bash
lines=7      #这个值是指这个脚本的行数加1,这个脚本共有6行
tail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。
tar jxvf /tmp/hellowrold.tar.gz
cp helloworld /bin
exit 0
[/php]
应该是bz2吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-20 12:57:37 | 显示全部楼层
Post by zhy2111314
这里有个错误:
[php]
#!/bin/bash
lines=7      #这个值是指这个脚本的行数加1,这个脚本共有6行
tail +$lines $0 >/tmp/helloworld.tar.gz # $0表示脚本本身,这个命令用来把从$lines开始的内容写入一个/tmp目录的helloworld.tar.gz文件里。
tar jxvf /tmp/hellowrold.tar.gz
cp helloworld /bin
exit 0
[/php]
应该是bz2吧?


多谢zhy2111314兄,我错了,马上修改
回复 支持 反对

使用道具 举报

发表于 2006-3-20 15:34:32 | 显示全部楼层
受教了,努力学习!
回复 支持 反对

使用道具 举报

发表于 2006-3-20 18:41:19 | 显示全部楼层
可否顺便介绍run程序安装包的卸载部分呢?
回复 支持 反对

使用道具 举报

发表于 2006-3-21 00:31:24 | 显示全部楼层
什么叫卸载?。。是程序本身的卸载?那么这个和 run  安装没什么关系,要看程序本身是如何安装的了。


to kiron:
lines=7
改进一下,比如用 grep 之类的程序找到第二部分的开始,然后自动赋值。可以用一个如 ######来隔开,然后搜索这个 #### 就可以基本定位了。

不知道这个建议是否有用,这样可以比较方便的制作 制作run脚本 的脚本。:)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-21 10:39:20 | 显示全部楼层
Post by 终极幻想
什么叫卸载?。。是程序本身的卸载?那么这个和 run  安装没什么关系,要看程序本身是如何安装的了。


to kiron:
lines=7
改进一下,比如用 grep 之类的程序找到第二部分的开始,然后自动赋值。可以用一个如 ######来隔开,然后搜索这个 #### 就可以基本定位了。

不知道这个建议是否有用,这样可以比较方便的制作 制作run脚本 的脚本。:)。


真是好主意,我修改一下。
回复 支持 反对

使用道具 举报

发表于 2006-3-21 10:51:25 | 显示全部楼层
Post by 终极幻想
什么叫卸载?。。是程序本身的卸载?那么这个和 run  安装没什么关系,要看程序本身是如何安装的了。

噢,我意思是像NVidia的安装包一样,写出可以添加参数:“--uninstall”一类的选项。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表