【问题标题】:Get output of shell command in ObjC在 ObjC 中获取 shell 命令的输出
【发布时间】:2013-03-19 14:29:11
【问题描述】:

我已经阅读了使用 NSTask 执行此操作的解决方案:它们看起来都非常长...所以我设法使用此代码执行完全相同的操作(同时获得标准输出和标准错误):

NSTask *task = [NSTask new];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:@[ @"-c", @"aCommand"]];
NSString *stringToRemove = [task description];
[task launch];
NSString *output = [[task description] stringByReplacingOccurrencesOfString:stringToRemove withString:@""];

使用此解决方案有什么缺点吗?有没有更短的方法来过滤输出?

【问题讨论】:

    标签: objective-c shell command nstask


    【解决方案1】:

    使用此解决方案有什么缺点吗?有没有更短的方法 过滤输出?

    是的,有很多缺点。您依赖于description 将神奇地返回任务的命令行和输出的实现细节。文档没有声明这一点,description 在调试/日志记录之外真的可以使用。

    即该代码仅在方便时起作用。

    但该代码并没有真正起作用。如果您要运行的命令永远不会退出或需要一段时间才能运行或产生大量输出,那么该代码可能实际上根本没有获取任何输出或产生截断的输出。

    使用NSTask 的示例往往有点冗长,这是有原因的。管理进程之间的 I/O 实际上非常困难,需要考虑很多不同的选项。

    【讨论】:

    • [task waitUntilExit] 是否避免了获取长效命令的完整输出的问题?
    • 不; waitUntilExit 将确保所有输出都已生成,但您仍然需要 NSPipeNSFileHandle 来使用输出,并且很可能使用 readInBackgroundAndNotify: 之类的东西。
    猜你喜欢
    • 2012-02-07
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2013-08-21
    • 1970-01-01
    • 2014-06-29
    相关资源
    最近更新 更多