我有多个 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
选项应该使解包阶段安静下来,不输出消息。但仍然有一些,我不知道为什么......