LinuxSir.cn,穿越时空的Linuxsir!

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

原创 一个shell的自解压程序

[复制链接]
发表于 2010-4-25 11:04:51 | 显示全部楼层 |阅读模式
昨天无意中搜索到一个shell的自解压程序,感觉很有意思的。

   原程序如下:

  #!/bin/sh
    ( read l; read l; read l ;exec cat ) < "$0" | gunzip | tar xf - && ls -l
   exit

    其中:

    ( read l; read l; read l ;exec cat ) 读取文件的前三行并扔掉,从第四行开始cat输出。

    程序将从第四行cat的输出交给gunzip解压,并将gunzip的解压结果继续交由tar解压,最后列解压后的文件。

    有此可以看出,该程序的使用:

     现将需要的文件打包,然后将该打包文件插入到该shell文件后面(即从第四行后面为打包的文件内容)。

     执行该shell程序达到自解压的目的。

     分析了一下,这个文件只是针对gzip的压缩程序的解压,于是我也写了两个,一个针对gzip的一个针对bzip2的。 程序如下:

      self_extract_g.sh 文件:

     #!/bin/bash
     (read l; read l; read l; exec cat) < "$0" | tar -xzvf - && ls -l
      exit 0;

      self_extract_b.sh 文件:

       #!/bin/bash
        (read l; read l; read l; exec cat) < "$0" | tar -xjvf - && ls -l
       exit 0;

做一次测试:

    1、建立data文件夹并创建三个文件test1, test2, test3

    2、将test1, test2, test3文件分别打包为,gzip和bzip2

    3、将gizp包文件植入self_extract_g.sh, 将bzip2包文件植入self_extract_b.sh

    4、最后执行两个自解压程序。

colinux@colinux:~/myshell/data$ ls  
test1  test2  test3  
colinux@colinux:~/myshell/data$ tar -czvf data.tar.gzip test*  
test1  
test2  
test3  
colinux@colinux:~/myshell/data$ tar -cjvf data.tar.bzip2 test*  
test1  
test2  
test3  
colinux@colinux:~/myshell/data$ ll  
total 20  
-rw-r--r-- 1 colinux colinux 178 2010-04-24 22:49 data.tar.bzip2  
-rw-r--r-- 1 colinux colinux 177 2010-04-24 22:49 data.tar.gzip  
-rw-r--r-- 1 colinux colinux  13 2010-04-24 21:26 test1  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:27 test2  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:26 test3  
colinux@colinux:~/myshell/data$ cp ../self_extract_* ./  
colinux@colinux:~/myshell/data$ ll  
total 28  
-rw-r--r-- 1 colinux colinux 178 2010-04-24 22:49 data.tar.bzip2  
-rw-r--r-- 1 colinux colinux 177 2010-04-24 22:49 data.tar.gzip  
-rw-r--r-- 1 colinux colinux  85 2010-04-24 22:50 self_extract_b.sh  
-rw-r--r-- 1 colinux colinux  84 2010-04-24 22:50 self_extract_g.sh  
-rw-r--r-- 1 colinux colinux  13 2010-04-24 21:26 test1  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:27 test2  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:26 test3  
colinux@colinux:~/myshell/data$ chmod +x self_extract_*  
colinux@colinux:~/myshell/data$ ll  
total 28  
-rw-r--r-- 1 colinux colinux 178 2010-04-24 22:49 data.tar.bzip2  
-rw-r--r-- 1 colinux colinux 177 2010-04-24 22:49 data.tar.gzip  
-rwxr-xr-x 1 colinux colinux  85 2010-04-24 22:50 self_extract_b.sh  
-rwxr-xr-x 1 colinux colinux  84 2010-04-24 22:50 self_extract_g.sh  
-rw-r--r-- 1 colinux colinux  13 2010-04-24 21:26 test1  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:27 test2  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:26 test3  
colinux@colinux:~/myshell/data$ ls  
test1  test2  test3  
colinux@colinux:~/myshell/data$ tar -czvf data.tar.gzip test*  
test1  
test2  
test3  
colinux@colinux:~/myshell/data$ tar -cjvf data.tar.bzip2 test*  
test1  
test2  
test3  
colinux@colinux:~/myshell/data$ ll  
total 20  
-rw-r--r-- 1 colinux colinux 178 2010-04-24 22:49 data.tar.bzip2  
-rw-r--r-- 1 colinux colinux 177 2010-04-24 22:49 data.tar.gzip  
-rw-r--r-- 1 colinux colinux  13 2010-04-24 21:26 test1  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:27 test2  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:26 test3  
colinux@colinux:~/myshell/data$ cp ../self_extract_* ./  
colinux@colinux:~/myshell/data$ ll  
total 28  
-rw-r--r-- 1 colinux colinux 178 2010-04-24 22:49 data.tar.bzip2  
-rw-r--r-- 1 colinux colinux 177 2010-04-24 22:49 data.tar.gzip  
-rw-r--r-- 1 colinux colinux  85 2010-04-24 22:50 self_extract_b.sh  
-rw-r--r-- 1 colinux colinux  84 2010-04-24 22:50 self_extract_g.sh  
-rw-r--r-- 1 colinux colinux  13 2010-04-24 21:26 test1  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:27 test2  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:26 test3  
colinux@colinux:~/myshell/data$ chmod +x self_extract_*  
colinux@colinux:~/myshell/data$ ll  
total 28  
-rw-r--r-- 1 colinux colinux 178 2010-04-24 22:49 data.tar.bzip2  
-rw-r--r-- 1 colinux colinux 177 2010-04-24 22:49 data.tar.gzip  
-rwxr-xr-x 1 colinux colinux  85 2010-04-24 22:50 self_extract_b.sh  
-rwxr-xr-x 1 colinux colinux  84 2010-04-24 22:50 self_extract_g.sh  
-rw-r--r-- 1 colinux colinux  13 2010-04-24 21:26 test1  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:27 test2  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:26 test3  
colinux@colinux:~/myshell/data$ cat data.tar.bzip2  >> self_extract_b.sh   
colinux@colinux:~/myshell/data$ cat data.tar.gzip  >> self_extract_g.sh   
colinux@colinux:~/myshell/data$ rm test*  
colinux@colinux:~/myshell/data$ ll  
total 16  
-rw-r--r-- 1 colinux colinux 178 2010-04-24 22:49 data.tar.bzip2  
-rw-r--r-- 1 colinux colinux 177 2010-04-24 22:49 data.tar.gzip  
-rwxr-xr-x 1 colinux colinux 263 2010-04-24 22:51 self_extract_b.sh  
-rwxr-xr-x 1 colinux colinux 261 2010-04-24 22:51 self_extract_g.sh  
colinux@colinux:~/myshell/data$ ./self_extract_b.sh   
test1  
test2  
test3  
total 28  
-rw-r--r-- 1 colinux colinux 178 2010-04-24 22:49 data.tar.bzip2  
-rw-r--r-- 1 colinux colinux 177 2010-04-24 22:49 data.tar.gzip  
-rwxr-xr-x 1 colinux colinux 263 2010-04-24 22:51 self_extract_b.sh  
-rwxr-xr-x 1 colinux colinux 261 2010-04-24 22:51 self_extract_g.sh  
-rw-r--r-- 1 colinux colinux  13 2010-04-24 21:26 test1  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:27 test2  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:26 test3  
colinux@colinux:~/myshell/data$ ll  
total 28  
-rw-r--r-- 1 colinux colinux 178 2010-04-24 22:49 data.tar.bzip2  
-rw-r--r-- 1 colinux colinux 177 2010-04-24 22:49 data.tar.gzip  
-rwxr-xr-x 1 colinux colinux 263 2010-04-24 22:51 self_extract_b.sh  
-rwxr-xr-x 1 colinux colinux 261 2010-04-24 22:51 self_extract_g.sh  
-rw-r--r-- 1 colinux colinux  13 2010-04-24 21:26 test1  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:27 test2  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:26 test3  
colinux@colinux:~/myshell/data$ rm test*  
colinux@colinux:~/myshell/data$ ll  
total 16  
-rw-r--r-- 1 colinux colinux 178 2010-04-24 22:49 data.tar.bzip2  
-rw-r--r-- 1 colinux colinux 177 2010-04-24 22:49 data.tar.gzip  
-rwxr-xr-x 1 colinux colinux 263 2010-04-24 22:51 self_extract_b.sh  
-rwxr-xr-x 1 colinux colinux 261 2010-04-24 22:51 self_extract_g.sh  
colinux@colinux:~/myshell/data$ ./self_extract_g.sh   
test1  
test2  
test3  
total 28  
-rw-r--r-- 1 colinux colinux 178 2010-04-24 22:49 data.tar.bzip2  
-rw-r--r-- 1 colinux colinux 177 2010-04-24 22:49 data.tar.gzip  
-rwxr-xr-x 1 colinux colinux 263 2010-04-24 22:51 self_extract_b.sh  
-rwxr-xr-x 1 colinux colinux 261 2010-04-24 22:51 self_extract_g.sh  
-rw-r--r-- 1 colinux colinux  13 2010-04-24 21:26 test1  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:27 test2  
-rw-r--r-- 1 colinux colinux  11 2010-04-24 21:26 test3  



两个程序均值针对一种压缩格式,本来想合并起来,一个文件适应两种压缩格式,后来想想既然是自解压,自己当然知道自己是什么格式的了,合并没必要的啦,所以就这样了哦。

呵呵
发表于 2010-4-25 13:36:35 | 显示全部楼层
挺好。

不过,早有更加完善标准解决方案。
http://en.wikipedia.org/wiki/Shar

推荐 makeself,其自身就是一个 shell script。
http://megastep.org/makeself/
回复 支持 反对

使用道具 举报

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

本版积分规则

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