如何使用单个命令从 dmg 静默安装 MacOS .app?
How can I silently install a MacOS .app from a dmg, using a single command?
我正在为我的跨平台应用程序编写一个自动更新工具。更新程序部分下载安装程序文件并执行 shell 命令来安装它。在 MacOS 上,我们的 "installer" 采用 .dmg
文件的形式。我需要能够静默安装磁盘映像,copy/overwrite 包含的 .app
(s) 到目标目录,然后卸载磁盘映像。我假设磁盘映像包含一个可以直接复制到 /Applications
或其他地方的包。没有明智的方法来处理任意 .dmg
文件作为 asked before,因为它的内容是未知的。必须做出一些假设。
VOLUME=$(hdiutil attach -nobrowse '[DMG FILE]' |
tail -n1 | cut -f3-; exit ${PIPESTATUS[0]}) &&
(rsync -a "$VOLUME"/*.app /Applications/; SYNCED=$?
(hdiutil detach -force -quiet "$VOLUME" || exit $?) && exit "$SYNCED")
我来分解一下:
hdiutil attach -nobrowse '[DMG FILE]'
挂载磁盘映像,但不在桌面上显示
| tail -n1 | cut -f3-
丢弃hdiutil最后一行输出的前两个token,剩下的就是挂载卷
VOLUME=$(...; exit ${PIPESTATUS[0]})
设置VOLUME
为上面的输出,设置退出码为hdiutil
&&
如果磁盘镜像挂载成功...
rsync -a "$VOLUME"/*.app /Applications/
...使用rsync
将.app文件复制到/Applications
目录,同时保留permissions/symlinks/ownership等
; SYNCED=$?
rsync
操作的存储结果
(hdiutil detach -force -quiet "$VOLUME"
强制卸载磁盘映像
|| exit $?) && "$SYNCED"
使用 hdiutil
退出代码退出,如果 hdiutil
成功 ,则使用 rsync
退出代码
我正在为我的跨平台应用程序编写一个自动更新工具。更新程序部分下载安装程序文件并执行 shell 命令来安装它。在 MacOS 上,我们的 "installer" 采用 .dmg
文件的形式。我需要能够静默安装磁盘映像,copy/overwrite 包含的 .app
(s) 到目标目录,然后卸载磁盘映像。我假设磁盘映像包含一个可以直接复制到 /Applications
或其他地方的包。没有明智的方法来处理任意 .dmg
文件作为 asked before,因为它的内容是未知的。必须做出一些假设。
VOLUME=$(hdiutil attach -nobrowse '[DMG FILE]' |
tail -n1 | cut -f3-; exit ${PIPESTATUS[0]}) &&
(rsync -a "$VOLUME"/*.app /Applications/; SYNCED=$?
(hdiutil detach -force -quiet "$VOLUME" || exit $?) && exit "$SYNCED")
我来分解一下:
hdiutil attach -nobrowse '[DMG FILE]'
挂载磁盘映像,但不在桌面上显示| tail -n1 | cut -f3-
丢弃hdiutil最后一行输出的前两个token,剩下的就是挂载卷VOLUME=$(...; exit ${PIPESTATUS[0]})
设置VOLUME
为上面的输出,设置退出码为hdiutil
&&
如果磁盘镜像挂载成功...rsync -a "$VOLUME"/*.app /Applications/
...使用rsync
将.app文件复制到/Applications
目录,同时保留permissions/symlinks/ownership等; SYNCED=$?
rsync
操作的存储结果(hdiutil detach -force -quiet "$VOLUME"
强制卸载磁盘映像|| exit $?) && "$SYNCED"
使用hdiutil
退出代码退出,如果hdiutil
成功 ,则使用
rsync
退出代码