我正在为我的跨平台应用程序编写一个自动更新工具。 updater部分下载安装程序文件并执行shell命令来安装它。在MacOS上,我们的“安装程序”采用.dmg
文件的形式。我需要能够以静默方式挂载磁盘映像,将包含的.app
复制/覆盖到目标目录,然后卸载磁盘映像。我假设磁盘映像包含一个可以直接复制到/Applications
或其他地方的包。没有合理的方法来处理任意.dmg
文件作为asked before,因为其内容无法知道。必须做出一些假设。
VOLUME=$(hdiutil attach -nobrowse '[DMG FILE]' |
awk 'END {print $3}'; exit ${PIPESTATUS[0]}) &&
(rsync -a "$VOLUME"/*.app /Applications/; SYNCED=$?
hdiutil detach -quiet "$VOLUME"; exit $? || exit "$SYNCED")
我会打破这个:
hdiutil attach -nobrowse '[DMG FILE]'
挂载磁盘映像,但不要在桌面上显示| awk 'END {print $3}'
从hdiutil输出的最后一行中提取第三个标记,即输出的卷VOLUME=$(...; exit ${PIPESTATUS[0]})
将VOLUME
设置为上述输出,并将退出代码设置为hdiutil
的输出代码&&
如果磁盘映像已成功安装...rsync -a "$VOLUME"/*.app /Applications/
...使用rsync将.app文件复制到/Applications
目录,同时保留权限/符号链接/所有权等。; SYNCED=$?
存储rsync操作的结果hdiutil detach -quiet "$VOLUME"
卸载磁盘映像exit $? || "$SYNCED"
使用hdiutil退出代码退出,如果hdiutil成功则退出rsync退出代码