我正在为我的跨平台应用程序编写自动更新工具。更新程序部分下载安装程序文件并执行Shell命令以进行安装。在MacOS上,我们的“安装程序”采用.dmg
文件的形式。我需要能够以静默方式挂载磁盘映像,将包含的.app
复制/覆盖到目标目录,然后卸载磁盘映像。我假设磁盘映像包含可以直接复制到/Applications
或其他位置的捆绑软件。没有明智的方式将任意.dmg
文件处理为asked before,因为无法知道其内容。必须做出一些假设。
答案 0 :(得分:0)
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退出代码