带命令行输入重定向的 NSTask
NSTask with command-line input redirection
我正在尝试学习以 task 进程可以接受 input 的方式编写 NSTask文件重定向 作为参数。在传统的 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];
我显然做错了什么并且遗漏了一些明显重要的东西,但无法弄清楚是什么。非常欢迎提示。谢谢!
输入重定向只使用文件的内容而不是标准输入的内容。您必须将 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];
我正在尝试学习以 task 进程可以接受 input 的方式编写 NSTask文件重定向 作为参数。在传统的 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];
我显然做错了什么并且遗漏了一些明显重要的东西,但无法弄清楚是什么。非常欢迎提示。谢谢!
输入重定向只使用文件的内容而不是标准输入的内容。您必须将 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];