'cat'命令的NSTask问题

时间:2010-12-23 20:12:11

标签: cocoa terminal nstask cat

我尝试使用cat命令连接文件。 当我在终端中使用它时,一切正常:

cat /Users/Home/Desktop/test.mp3* > test.mp3

尝试使用NSTask重现这一点,给出了以下错误:

代码:

NSArray *Args = [NSArray arrayWithObjects:[NSString stringWithFormat:@"%@*",[TAFileName stringByDeletingPathExtension]],@">",[TAFileName stringByDeletingPathExtension],nil];
NSLog(@"%@",Args);
NSString *LaunchPath = [[NSBundle mainBundle] pathForResource:@"cat" ofType:@""];
[self startTaskWithLaunchPath:LaunchPath andArguments:Args showingProcess:NO];

NSLog输出:

(
"/Users/Home/Desktop/test.mp3*",
">",
"/Users/Home/Desktop/test.mp3"
)

错误:

cat: /Users/Home/Desktop/test.mp3*: No such file or directory
cat: >: No such file or directory
cat: /Users/Home/Desktop/test.mp3: No such file or directory

“startTaskWithLaunchPath:andArguments:showsProcess:”与许多其他终端命令一起正常工作,我百分百肯定这不是问题。

2 个答案:

答案 0 :(得分:1)

问题是输入重定向和通配,由shell(通常是#!/ bin / bash)而不是cat命令处理。因此,使用参数启动任务以将“test.mp3 *”扩展为真实的MP3名称,然后将其重定向到其他位置并不是任务可以执行的任务。

我建议您查看是否可以直接调用shell脚本,甚至可以在应用程序中动态创建它 - 然后将其作为bash应用程序的参数调用。然后它应该做你需要的。

答案 1 :(得分:0)

我设法使用“/ bin / sh”来解决问题。这会将命令解析为shell并像这样运行它。使用这种方法仍然输出“没有这样的文件”,但我通过改变任务初始工作目录解决了这个问题。

启动任务的代码:

NSArray *Args = [NSArray arrayWithObjects:@"-c",[NSString stringWithFormat:@"cat %@.* >> %@",[[TAFileName lastPathComponent] stringByDeletingPathExtension],[[TAFileName lastPathComponent] stringByDeletingPathExtension]],nil];
NSString *LaunchPath = @"/bin/sh";
[self startTaskWithLaunchPath:LaunchPath andArguments:Args showingProcess:NO];

更改目录的代码:

[TATask setCurrentDirectoryPath:[NSString stringWithFormat:@"%@/",[TAFileName stringByDeletingLastPathComponent]]];

这解决了一切。谢谢,迈克尔,求助。