【问题标题】:NSTask with command-line input redirection带有命令行输入重定向的 NSTask
【发布时间】:2015-03-20 16:23:56
【问题描述】:

我正在尝试学习编写 NSTask 以使 task 进程可以接受 输入文件重定向 作为参数。在传统的 unix system() 命令中,这对于代码来说是微不足道的,但对于我的应用程序的需求来说,还远远不够可控。我试图理解的例子是 which 参数属于 where。这是完整的命令,可以输入到 stdin 或传递给 system():

cd /Users/Shared ; /usr/local/bin/C_command < /Users/Shared/s.txt

其中 C_command 代表标准 unix 命令行工具,它接受重定向以从文件中读取的输入参数,与所写的完全相同.启动路径将是:

task.launchPath = @"/usr/local/bin/C_command";

当前目录必须是:

task.currentDirectoryPath = @"/Users/Shared";

如果将以下内容作为参数:

NSArray *args = [NSArray arrayWithObjects:[NSString stringWithFormat: @" < /Users/shared/s.txt"], nil];

甚至这个:

NSArray *args = [NSArray arrayWithObjects:[NSString stringWithFormat: @" < "], [NSString stringWithFormat: @"/Users/shared/s.txt"], nil];

我显然做错了什么,错过了一些明显重要的东西,但不知道是什么。非常欢迎提示。谢谢!

【问题讨论】:

    标签: macos cocoa unix nstask


    【解决方案1】:

    输入重定向只使用文件的内容而不是标准输入的内容。您必须将NSTask 对象的标准输入连接到文件。像这样的东西应该可以工作:

    NSTask *task = [[NSTask alloc] init];
    NSFileHandle *stdin = [NSFileHandle fileHandleForReadingAtPath:@"/Users/shared/s.txt"];
    [task setLaunchPath:@"/usr/local/bin/C_command"];
    [task setCurrentDirectoryPath:@"/Users/Shared"];
    [task setStandardInput:stdin];
    

    【讨论】:

    • 这真是太棒了。我在网络上绝对找不到关于此的文档,或者它可能存在于 API 参考文件中太深的某个地方。最让我惊讶的是它不需要NSArray *args,这实际上是合乎逻辑的。我认为问题已得到解答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2015-11-20
    • 2020-04-07
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多