NSTask与命令行输入重定向

时间:2015-03-20 16:23:57

标签: macos cocoa unix nstask

我正在尝试学习编写 NSTask ,以便任务进程可以接受输入文件重定向作为参数。在传统的unix system()命令中,这对于代码来说是微不足道的,但是对于我的应用程序的需求来说太远了。我想要理解的例子是哪个参数属于其中。这是完整的命令,可以输入 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];

我显然做错了什么,错过了一些显而易见的重要事情,但却无法弄清楚是什么。提示非常受欢迎。谢谢!

1 个答案:

答案 0 :(得分:2)

输入重定向只使用文件的内容而不是stdin的内容。您必须将NSTask对象的stdin连接到该文件。这样的事情应该有效:

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];