我对包含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中通过终端尝试命令,我会得到我希望在我的应用程序中得到的结果。我在这里完全失去了,真的希望有人可以解决这个问题,以及如何解决它。
答案 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 -v
和bash -xv -c
。
您的代码在我的Mac OS X 10.6.8计算机上使用来自NSPipe - CocoaDev的asynctask.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];