Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可执行文件是否总是在MacOS上打开终端窗口?_Macos_Terminal_Executable_App Bundle - Fatal编程技术网

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

可执行文件是否总是在MacOS上打开终端窗口?,macos,terminal,executable,app-bundle,Macos,Terminal,Executable,App Bundle,我在MacOS X上,我对应用程序包类型的东西很陌生。我正在编写一个打开窗口并注册鼠标输入的程序,而不是命令行工具。当我将代码(如果重要的话,是用C编写的)编译成一个可执行文件(“unix可执行文件”),然后直接运行该文件(例如,双击它),会弹出一个终端窗口,然后会弹出程序窗口。同样,如果我导航到可执行文件的目录并从命令行打开它,它会弹出open/other/terminal窗口,然后是程序的窗口 但是,如果我将可执行文件包装成一个包(因此,我认为,将其转换为一个适当的“应用程序”),那么当我通

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


但是,如果我将可执行文件包装成一个包(因此,我认为,将其转换为一个适当的“应用程序”),那么当我通过双击或从命令行运行应用程序时,程序窗口将打开,并且不会创建新的终端窗口。这仅仅是“应用程序包”架构的一个属性吗?或者有没有一种方法可以让我运行原始可执行文件而不产生另一个终端窗口?我怀疑我误解了一些基本的东西。提前谢谢

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

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

Info.plist中的其他项目告诉launch services如何处理应用程序,例如检查是否已超过操作系统的最低或最高版本,或者是否显示停靠项目


一个单独的二进制文件没有相关的Info.plist清单,因此它的行为不能改变,并且会打开一个终端窗口。

启动服务(Finder、Dock和
open
命令在打开stuff时使用的框架)基本上将裸可执行文件视为文档。处理此类文档的应用程序是终端。所以,当您以这种方式打开一个可执行文件时,如果终端尚未运行,它将启动终端,并告诉它打开文档。终端通过打开一个新的shell窗口并自动键入“文档”的路径作为命令行来实现这一点

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


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

“同样,如果我导航到可执行文件的目录并从命令行打开它”——我假定您的意思是使用“打开”(
cd/path/to/exe;open exe
)。如果您只是运行可执行文件(
cd/path/to/exe;/exe
),这将是我的一个超级愚蠢的错误。非常感谢。谢谢!我希望我能将多个答案标记为正确,而不仅仅是对它们进行投票。总之,这条线教会了我所有我需要知道的事情。