使用下面的工具就可以做一个简单的自解压程序。
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