1. 说明
- run文件的本质是一个可执行脚本+压缩包
- 所以run文件内容分两部分,前一部分是可执行脚本,后一部分是压缩包
- 可执行脚本的作用是解压压缩包和进行文件内容的安装和配置
- 压缩包的内容是要安装的文件
run文件结构:
|-----------------|
| 可执行脚本 |
|-----------------|
| 程序压缩包 |
|-----------------|
2. 制作一个run文件
下面以一个简单的hello_world程序来制作run文件
2.1 生成要安装的文件
编写源文件hello.cpp
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
编译生成可执行程序 hello
g++ -c hello.cpp
g++ -o hello hello.o
2.2 组织目录结构并生成压缩包
制作一个hello目录,里面建立一个bin目录,把上面编译出的hello放入bin目录下
把hello目录打包:
tar -zcvf hello.tar.gz hello/
2.3 编写可执行脚本部分内容
是一个shell脚本,姑且命名为install.sh文件
#!/bin/bash
CDIR=`pwd`
INSTALLDIR=$CDIR/hello
if [ -d "$INSTALLDIR" ]; then
rm -rf "$INSTALLDIR"
fi
ARCHIVE=`awk '/^__ARCHIVE_BOUNDARY__/ { print NR + 1; exit 0; }' $0`
tail -n +$ARCHIVE $0 > hello.tar.gz
tar -zpxf hello.tar.gz
rm hello.tar.gz
exit 0
__ARCHIVE_BOUNDARY__
脚本各行功能说明如下:
- 找到可执行脚本和压缩包的分界线。
因为run文件是可执行脚本和压缩包合在一起的。安装时,首先是要把压缩包文件从整个run文件中提取出来。
下面这个命令是找到run文件中可执行脚本和压缩包的分界线。
ARCHIVE=`awk '/^__ARCHIVE_FOLLOWS__/ { print NR + 1; exit 0; }' $0`
其原理是在可执行脚本末尾放个__ARCHIVE_BOUNDARY__
标志,然后找这个标记的行号,名字可根据自己命名习惯去命名。
也有很多脚本是直接写死数字的,但是这样写更灵活,不用数行号。
- 提取压缩包,并解压
tail -n +$ARCHIVE $0 > hello.tar.gz
tar -zpxf hello.tar.gz
- 配置
如果有其他配置,可以增加相关命令。比如增加udev配置文件、执行相关的shell文件,删除文件等。
我们这里由于程序很简单,没有相关配置命令。 - 删除压缩包
rm hello.tar.gz
安装包解压之后,压缩包就不再有用了,可删除。 - 中断脚本执行
exit 0
这一步必须添加,防止继续执行,执行到压缩包内容去,压缩包内容不是要执行的。执行反而可能出现不可预期的错误 - 标志位
__ARCHIVE_BOUNDARY__
2.4 生成run文件
生成run文件就是把可执行脚本和压缩包拼在一起。可使用如下命令:
cat install.sh hello.tar.gz > hello.run
名字部分根据上面自己写的名字进行替换。
至此,run文件的制作就完成了。
2.5 运行run文件
给写权限后,直接运行即可:
chmod +x hello.run
./hello.run
这样run文件就会自动解压安装了。
3. 读取其他run文件的可执行脚本部分内容
读取 .run 文件的执行部分,即那部分文件头
直接用 gedit 去打开run文件,就能看到前面那部分
后面的压缩包内容部分,看起来是乱码。
网友评论