某些软件(例如NetBeans IDE)在.sh文件中提供Linux安装程序。想知道他们如何将整个IDE打包成'shell脚本',我在编辑器中打开了文件。我看到一些纯文本shell脚本代码,然后是一些随机的乱码,我认为它是“二进制”或非纯文本。
我想知道他们如何混合普通的shell脚本,然后可能会调用'不可读'的东西,这将是二进制文件。
对此有何见解?
答案 0 :(得分:86)
基本上,它是一个shell脚本,前面是某种压缩存档,例如tar存档。您自己使用tail
或sed
命令(Bourne shell中的$0
变量)来剥离前端的shell脚本,并将其余部分传递给您的unarchiver。
例如,将以下脚本创建为self-extracting
:
#!/bin/sh -e
sed -e '1,/^exit$/d' "$0" | tar xzf - && ./project/Setup
exit
上面的sed
命令删除文件第一行中的所有行到以“exit”开头的第一行,然后传递其余行。如果在“exit”行之后立即启动的是tar文件,tar
命令将提取它。如果成功,将执行./project/Setup
文件(可能是从tarball中提取的)。
然后:
mkdir project
echo "#!/bin/sh" > project/Setup
echo "echo This is the setup script!" >> project/Setup
chmod +x project/Setup
tar czf - project >> self-extracting
现在,如果您删除旧的project
目录,则可以运行self-extracting
,它将提取该tar文件并运行安装脚本。
答案 1 :(得分:52)
您可能需要查看makeself.sh
来自作者的笔记。
makeself.sh 是一个小型shell脚本,可从目录生成可自解压的tar.gz存档。生成的文件显示为shell脚本(其中许多具有.run后缀),并且可以按原样启动。然后,归档文件将解压缩到临时目录,并执行可选的任意命令(例如安装脚本)。
Makeself档案还包括完整性自我验证的校验和(CRC和/或MD5校验和)。
makeself.sh脚本本身仅用于从文件目录创建存档。生成的存档实际上是一个压缩的(使用gzip,bzip2或压缩)TAR存档,开头有一个小的shell脚本存根。这个小存根执行提取文件,运行嵌入式命令以及全部删除临时文件的所有步骤。用户安装此类存档中包含的软件所需要做的就是“运行”存档[即执行脚本]
我试图让这个脚本的代码尽可能地保持可移植性,即它不依赖于任何特定于bash的功能,只调用安装在任何正常运行的UNIX兼容系统上的命令。这个脚本及其生成的档案应该在任何Unix风格上运行,使用任何兼容的Bourne shell,当然也提供压缩程序。
最后,makeself
包本身就是一个名为makeself.run
的自解压脚本。
答案 2 :(得分:11)
答案 3 :(得分:4)
GNU sharutils:
http://www.gnu.org/software/sharutils/
是用于创建shell归档的工具集,并提供了一些可能有用的附加功能(例如校验和以确保有效负载在传输过程中不会受损)。
当最终产品必须由shell解释时,防止恶意修改并不可行 - 任何理解生成技术的人都可以修改校验和。
答案 4 :(得分:0)
还有其他/商业软件安装程序构建器(如InstallAnywhere),它们基本上都有自己的shar / makeself版本。
Netbeans有自己的安装程序引擎,其中一部分是解包和启动,它在NBI原生启动器组件中完成:http://wiki.netbeans.org/NBINativeLaunchers
为Linux / Unix / MacOS和Windows的本机可执行文件创建一个shell(脚本)存档。您也可以将该工具用于您自己的项目。