【shell】sh文件生成MacOS桌面可执行app
本帖最后由 jjjzw 于 2021-8-3 17:12 编辑使用了多年macOS后突然意识到,很少有应用程序会在桌面生成图标(像Windows那样),大多都从启动台和程序坞打开。
观察了一下我的桌面,发现有图标的可以是Application中应用程序的替身,也可以是一个app,运行后再运行指向的软件。
正好最近在使用破解版的BurpSuite,每次都需要将sh文件拖入终端运行,比较麻烦,于是想做一个app壳运行sh文件。
### app结构
经过观察,最简单的app结构可以表示为:
(app-name).app
└── Contents
└── MacOS
│ └── 脚本
└── Resources
└── Info.plist
其中,脚本可以是unix可执行文件applet:
一眼看出这是脚本编辑器导出的应用程序包,用脚本编辑器打开app:是用AppleScript写的命令:
(*Start *)
do shell script "open /Applications/Polyspace/R2020a/bin/matlab"
缺点:对于tell Terminal持续加载的软件,容易导致脚本编辑器无响应
第二种脚本是sh文件,Steam生成的游戏图标都是用这种方式:(PS:Steam生成的桌面图标一半都是损坏的,用本文的方法可以自己制做一个!)
其中,run.sh保存了要运行的命令:
#!/bin/bash
# autogenerated file - do not edit
open steam://run/644560
这就是本文的目标!(欢迎大家猜猜644560是什么游戏)
### Info.plist是什么
要使用制作出的app,需要一个合格的Info.plist文件
这个文件实现了一些功能如:直接向用户展示信息;系统内部用来标识你的app或其支持的文档类型;系统框架用来辅助app的加载等
#### Info.plist简单结构
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>run.sh</string>
······
</dict>
</plist>
其中key是属性,string是值,我们只需要一些必要的值就可以运行。(文后参考资料3)
### app生成脚本
掌握了结构,就可以写脚本添加到/usr/local/bin中供调用
touch appmake生成脚本文件
vim打开:
#!/usr/bin/env bash
APPNAME=${2:-$(basename "${1}" '.sh')};
DIR=$(dirname "${1}");
CON="${DIR}/${APPNAME}.app/Contents";
MAC="${DIR}/${APPNAME}.app/Contents/MacOS";
RES="${DIR}/${APPNAME}.app/Contents/Resources";
INF="${CON}/Info.plist";
if [ -a "${APPNAME}.app" ]; then
echo "${PWD}/${APPNAME}.app already exists. Provide some unique name if you want to create it anyway. ";
exit 1;
fi;
mkdir -p "${MAC}";
mkdir -p "${RES}"
cp "${1}" "${MAC}/run.sh";
chmod +x "${MAC}/run.sh";
cat>>"${INF}"<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>run.sh</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>1.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
</dict>
</plist>
EOF
echo "CREATE ${DIR}/${APPNAME}.app SUCCESSFULLY";
保存到appmake文件
将appmake文件复制到/usr/local/bin
终端输入:
sudo chmod +x /usr/local/bin/appmake
调用:
> 调用方式:终端输入:
> `appmake parameter1 parameter2`
> parameter1为sh文件__全路径__,parameter2为app名字(缺省为sh文件名)
> __输出app到sh文件目录下__
### 示例
BurpSuite.sh:
#!/bin/bash
/Applications/Burp\ Suite\ Professional.app/Contents/PlugIns/jre.bundle/Contents/Home/bin/java -Dfile.encoding=utf-8 -noverify -javaagent:/Applications/Burp\ Suite\ Professional.app/Contents/java/app/burp-loader-x-Ai.jar -Xmx2048m -jar /Applications/Burp\ Suite\ Professional.app/Contents/java/app/burpsuite_pro.jar
终端:
appmake /Users/apple/Desktop/BurpSuite.sh BurpSuite
输出:
CREATE /Users/apple/Desktop/BurpSuite.app SUCCESSFULLY!
双击可以运行!
(app图标可以自行设置)
意外收获:原先需要终端持续加载的软件,生成app后居然可以直接打开,目前还不明白原理,欢迎大家测试!
### 总结
因为没有接触过Xcode、Shell和AppleScript开发,这次探索学到了相当多的知识,脚本完成后再看macOS应用程序的结构,有恍然大悟之感
### 参考资料
(https://techtalkbook.com/create-mac-app-from-a-shell-script/)
(https://www.runoob.com/linux/linux-shell.html)
(https://blog.csdn.net/baseterminal/article/details/109774754) 感谢分享,非常有用的资料,看来可以封装网页一个桌面app Takitooru 发表于 2021-8-3 17:14
感谢分享,非常有用的资料,看来可以封装网页一个桌面app
妙啊!iOS提供了网页url的封装,Mac好像没有。
#!/bin/bash
open -a "/Applications/Safari.app" https://www.52pojie.cn/forum.php
封装成果:
楼主有没有.sh这类教程 小白过来学习了 楼主,如何把.sh文件封装成mac系统双击可执行文件(和win下的.bat那种)双击直接调用的终端窗口
页:
[1]