如何将多个 bash 脚本打包成一个可执行文件

如何将多个 bash 脚本打包成一个可执行文件

我有多个 bash 脚本和这些脚本所需的资源(如音乐文件和图像),我想将它们全部打包成一个可执行文件。

例如:

$ find Scripts/

Scripts/
Scripts/main.sh
Scripts/bin/1.sh
Scripts/bin/2.sh
Scripts/src/music.mp3

现在,我想将所有这些打包成一个可执行文件,如果我执行它,就会执行该Scripts/main.sh文件。

我怎样才能做到这一点?

答案1

一种方法是使用Shell 档案 (shar)实用程序。它可能不是默认安装的,但可能存在于您的发行版的存储库中。

非常类似于tar它可以创建文件列表的单文件存档。不同之处在于存档文件是自解压的:这是一个必须运行的 shell 脚本。

就你的情况而言:

shar -M -D -Q Scripts/ > myarchive.sh将整个 Scripts/ 文件夹打包到 中myarchive.sh

然后你可以传递myarchive.sh给其他人。通过运行,sh myarchive.sh他将在本地解压 Scripts/ 及其所有内容。

但这还不够,因为你还要执行 Scripts/main.sh 。然后你必须在末尾添加此命令,myarchive.sh完整命令为:

shar -M -D -Q Scripts/ | head -n -1 > myarchive.sh && echo "Scripts/main.sh" >> myarchive.sh

的目的head -n -1是删除档案的最后一行,即exit 0,否则您添加的命令将不会被执行。我没有测试过,因为这种语法在 macOS 上不起作用(我改用了grep -v "exit 0",但这可能会有边缘效应)。

现在,一旦档案解压完毕,Scripts/main.sh 就会被执行。

我无法解决一个(小)问题:该-Q选项应该使解包阶段安静下来,不输出消息。但仍然有一些,我不知道为什么......

相关内容