NSTask无法使用旧版本的Mac OSX

时间:2013-01-01 23:26:37

标签: objective-c cocoa nstask

我对包含NSTask的方法有一个非常奇怪的问题。在10.7+中,功能完全正常并成功执行,返回结果并将文件复制到所需目录。

在10.6.8中尝试我的应用程序时,NSTask似乎什么都不做,事实上没有任何错误,或任何事情可以让我暗示为什么它不起作用。我已经尝试了所有可能的角度来确定问题所在,并且我从可能性中挖掘出来。 : - /

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];

NSArray *arguments = [NSArray arrayWithObjects: @"-c",
                     @"find /Data/*.jug/files/ -name thefile | head -n 1 | awk -v dir=\"$HOME/path/to/copy/to\" '{printf \"cp \\\"%s\\\" \\\"%s\\\"\\n\", $1, dir }' | sh", nil];

[task setArguments: arguments];

NSPipe *thePipe = [NSPipe pipe];
[task setStandardInput:[NSPipe pipe]];
[task setStandardOutput:thePipe];

[task launch];
[task waitUntilExit];
[task release];

如果在10.6.8中通过终端尝试命令,我会得到我希望在我的应用程序中得到的结果。我在这里完全失去了,真的希望有人可以解决这个问题,以及如何解决它。

2 个答案:

答案 0 :(得分:0)

请使用以下引号进行尝试:

'/Data/*.jug/files/' 

 \"/Data/*.jug/files/\"

答案 1 :(得分:0)

当shell的glob扩展没有文件匹配时,/Data/*.jug: Not a directory错误消息通常会发生,并且文字/Data/*.jug被传递给需要现有文件或目录的命令作为一个论点。

使用Bash shell,您可以使用shopt -s nullglob来避免此类错误。

此外,您应确保启用了全局展开(set +f中的Bash)。

因此明确地将Bash shell与[task setLaunchPath: @"/bin/bash"];一起使用,并开始使用以下代码测试shell代码:

@"set +f; shopt -s nullglob; ls -ld /; find /Data/*.jug/files/ -name thefile"

然后添加&逐步测试给定shell代码的每个进一步命令。

您也可以使用完整的可执行路径来确保,e。 G。 /usr/bin/find

awk命令中,将$1替换为$0,以防文件名包含空格。

编译器混淆的可能原因可能是/*中的C风格评论开始/Data/*.jug/files/

要获得更多输出信息,请尽可能使用详细模式下的shell命令,例如: G。 cp -vbash -xv -c

您的代码在我的Mac OS X 10.6.8计算机上使用来自NSPipe - CocoaDevasynctask.m/usr/bin/gcc-4.2作为编译器。

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/bash"];

NSArray *arguments = [NSArray arrayWithObjects: 
   @"-xv",
   @"-c",
   @"set +f; shopt -s nullglob; ls -ld /noSuchFile; find /Data/*.jug/files/ -name thefile | head -n 1 | awk -v dir=\"$HOME/path/to/copy/to\" '{printf \"cp -v \\\"%s\\\" \\\"%s\\\"\\n\", $1, dir }' | bash -xv", nil];