Cocoa设置终端退出代码变量

时间:2013-12-07 05:38:13

标签: objective-c macos cocoa

我希望能够设置一个终端变量;基本上我想要做的是通过我的应用程序分配我自己的退出代码。我的研究发现NSTask可能是这样做的方法,但我不能肯定地说如何继续这个,因为我知道一个,我不知道我是否可以有一个setLaunchPath:

以下是我在终端中输入内容的示例:

  

bash-3.2$ $(exit 15); echo ${?};

     

15

很抱歉,如果这个问题听起来不太技术性。请询问您是否需要澄清。 Thx提前。

1 个答案:

答案 0 :(得分:1)

这不适合Cocoa应用程序。或者您正在考虑使用Foundation命令行工具吗?

首先,从命令行shell调用Cocoa应用程序并不常见。如果这样做,最常见的是使用/usr/bin/open命令,这通常不是同步的,因此不会将应用程序的退出状态传达给shell。

其次,退出的进程不直接设置shell变量。它以状态代码退出,并存储在内核中。然后,shell从内核获取该状态代码并设置其自己的变量。在没有其他进程合作的情况下,一个进程通常不可能在另一个进程中设置环境变量(或任何其他状态)(除了它自己产生的一个进程)。

第三,Cocoa应用程序通常使用-[NSApplication terminate:]退出。这并没有提供一种方法来告诉框架使用什么值作为退出状态代码。 NSApplicationMain(),这是应用程序的main()函数通常调用的内容,记录为永不返回并调用exit()。文档建议它可以指定一些有意义的状态代码 - “如果你想确定应用程序退出的原因,你应该从exit函数中查看结果代码。” - 但不是那可能是什么,也没有办法影响它。

您可以从应用程序代理的exit()方法中自行调用-applicationWillTerminate:。这样,您就可以指定状态代码。不过,我不确定是否可能会破坏Cocoa可能做的最终清理工作。例如,如果您向粘贴板承诺了一些数据,Cocoa会在您的应用程序终止之前请求您提供它。我不确定这是发生在-applicationWillTerminate:之前还是之后(可能之前)。该委托调用是响应发布NSApplicationWillTerminateNotification通知的应用程序对象,并且可能有该通知的其他观察者。未指定观察者获得通知的顺序,因此应用程序委托不一定是获得它的最后一件事。