尝试执行 Bash 脚本时,它通常在某个目录内执行,并且需要访问本地资源。我想知道是否有办法将 Bash 脚本和资源(目录中的所有其他内容)合并为一个可执行文件,这样我只需要该可执行文件即可独立执行 Bash 脚本。
答案1
自解压脚本是可行的,而且并不罕见。安装程序经常使用它们。这个想法很简单:
- 脚本的上半部分设置了底部的执行
- 中间有一个
exit
命令,避免执行结束部分 - 最后部分是有效载荷
这是一个具体的例子。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
这对应于我之前提到的顶部和中间部分。本质上它的作用是:
- 将此脚本的末尾部分(第 10 行及以后)提取到临时目录中,使用
tar
local.txt
打印临时目录中预期的内容- 出口
此脚本尚未完成,我们需要添加结尾部分,该部分应为压缩文件tar
,其中包含名为的文件local.txt
。让我们先创建该文件:
echo hello world > local.txt
我们将该文件放入tar
,并将其附加到脚本的末尾:
tar zc local.txt >> script.sh
如果您script.sh
在文本编辑器中重新打开,您将在末尾看到一些乱码。这是二进制数据,即其中包含的压缩tar
档案的内容。如果您运行此脚本,它将从其自身解压缩的嵌入文件中输出 。local.txt
hello world
local.txt
您可以使用相同的技术来创建有意义且复杂的东西。