如何使用单个命令从 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 退出代码