可执行文件是否总是在 MacOS 上打开终端 window?

Do executable files always open a terminal window on MacOS?

我使用的是 MacOS X,我对应用程序包类型的东西还很陌生。我正在编写一个打开 window 并注册鼠标输入的程序——不是命令行工具。当我将我的代码(用 C 编写,如果这很重要)编译成一个可执行文件("unix executable file"),然后直接 运行 该文件(例如通过双击它)时,终端 window弹出,然后程序的window弹出。同样,如果我导航到可执行文件的目录并从命令行打开它,它会弹出 open /another/ terminal window 然后程序的 window.

但是,如果我将可执行文件包装在一个包中(因此,我想,将其变成一个合适的 "app"),那么当我 运行 应用程序时,通过双击或从在命令行中,程序的 window 打开并且没有创建新的终端 window。这仅仅是 "app bundle" 架构的 属性 吗?或者有没有一种方法可以 运行 原始可执行文件而不需要另一个终端 window?我怀疑我误解了一些基本的东西。提前致谢!

我相信你看到的是正确的。为了不弹出单独的 window,您需要将其封装到一个包中。

通过双击捆绑包或使用终端中的 'open' 命令启动使用 Apple 的 Launch Services,它维护着一个已知(已注册)应用程序的列表。当应用程序(bundle)被引入系统时,它会在 Launch Services 中注册并与其 URI 相关联(例如 com.apple.calculator),该 URI 存在于 bundle 的 Info.plist

Info.plist 中的其他项目告诉启动服务如何处理应用程序,例如检查是否超过了 OS 的最低或最高版本,或者是否显示停靠项目。

一个单独的二进制文件没有关联的 Info.plist 清单,因此它的行为无法改变,终端 window 打开。

Launch Services(Finder、Dock 和 open 命令在您打开内容时使用的框架)实质上将裸可执行文件视为文档。处理此类文件的应用程序是终端。因此,当您以这种方式打开可执行文件时,如果终端尚未 运行ning ,它会启动终端并告诉它打开文档。终端通过打开一个新的 shell window 和 auto-typing 到 "document" 的路径作为命令行来做到这一点。

Launch Services 处理捆绑的应用程序以及应用程序。如果该应用程序已经 运行ning,它会激活它并可能打开一个新的无标题 window。否则,它会启动它。

正如 Rob Napier 在评论中指出的那样,如果您直接从命令行 运行 一个可执行文件(或者如果某些 already-running 应用程序使用 NSTask 或 fork+exec 启动它) ,它只会 运行。不涉及启动服务,因此不会要求终端将可执行文件作为文档打开。