将 Bash 脚本和脚本资源合并为一个可执行文件

将 Bash 脚本和脚本资源合并为一个可执行文件

尝试执行 Bash 脚本时,它通常在某个目录内执行,并且需要访问本地资源。我想知道是否有办法将 Bash 脚本和资源(目录中的所有其他内容)合并为一个可执行文件,这样我只需要该可执行文件即可独立执行 Bash 脚本。

答案1

自解压脚本是可行的,而且并不罕见。安装程序经常使用它们。这个想法很简单:

  1. 脚本的上半部分设置了底部的执行
  2. 中间有一个exit命令,避免执行结束部分
  3. 最后部分是有效载荷

这是一个具体的例子。script.sh使用以下内容创建:

#!/usr/bin/env bash

me=$(cd "$(dirname "$0")"; pwd)/"$(basename "$0")"

cd "$(mktemp -d)"
tail -n +10 "$me" | tar zx
cat local.txt

exit

这对应于我之前提到的顶部和中间部分。本质上它的作用是:

  1. 将此脚本的末尾部分(第 10 行及以后)提取到临时目录中,使用tar
  2. local.txt打印临时目录中预期的内容
  3. 出口

此脚本尚未完成,我们需要添加结尾部分,该部分应为压缩文件tar,其中包含名为的文件local.txt。让我们先创建该文件:

echo hello world > local.txt

我们将该文件放入tar,并将其附加到脚本的末尾:

tar zc local.txt >> script.sh

如果您script.sh在文本编辑器中重新打开,您将在末尾看到一些乱码。这是二进制数据,即其中包含的压缩tar档案的内容。如果您运行此脚本,它将从其自身解压缩的嵌入文件中输出 。local.txthello worldlocal.txt

您可以使用相同的技术来创建有意义且复杂的东西。

相关内容