1

我尝试使用 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:showingProcess:”可以与许多其他终端命令一起正常工作,我 100% 确定这不是问题。

4

2 回答 2

1

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

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

于 2010-12-23T20:27:21.373 回答
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]]];

这解决了一切。谢谢你,迈克尔,你的帮助。

于 2010-12-28T14:42:26.440 回答