使用下面的工具就可以做一个简单的自解压程序。

http://stephanepeter.com/makeself/

用法小览:

# ./makeself.sh /tmp/helloworld test.sh "test" make
Header is 505 lines long

WARNING: Overwriting existing file: test.sh
About to compress 12 KB of data...
Adding files to archive named "test.sh"...
./
./helloworld.c
./Makefile
CRC: 1386344463
MD5: 20aad1a40ab571d2309f11112a153a3d

Self-extractable archive "test.sh" successfully created.



直接用 makeself.sh 生成一个 test.sh 的自解压脚本,

这个脚本里包含 /tmp/helloworld 里的内容,执行 test.sh 会执行 /tmp/helloworld 的 make 命令来生成 helloworld,

结果如下:

# ./test.sh
Verifying archive integrity... 100% All good.
Uncompressing test 100%
cc -g -o helloworld helloworld.c



当然 makeself.sh 这个脚本有许多的选项,这个就不在这里赘述了。

至于makeself.sh 的内部是怎么实现的?

可以参考下面

其实也很简单,就是使用 makeself.sh 生成的自解压脚本里的最后一部分是打包的binary,

自解压脚本执行时会把最后一部分的内容提取出来解压,然后再执行对应的命令。

找了一个网上最简单的示例,makeself.sh的原理就是如下这段内容。

#!/bin/bash
line=`wc -l $0|awk '{print $1}'`
line=`expr $line - 10` 
tail -n $line $0 |tar zx -C /tmp
cd /tmp/web
./install_web.sh
ret=$?
#
#
exit $ret