【问题标题】:NSTask not working on older version of Mac OSXNSTask 不适用于旧版本的 Mac OSX
【发布时间】:2013-01-01 23:26:37
【问题描述】:

我对包含 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 中通过终端尝试该命令,我会得到我希望在我的应用程序中得到的结果。我在这里完全不知所措,真的希望有人能对这个问题以及如何解决它有所了解。

【问题讨论】:

  • 我看到您正在使用 setSTandardInput 和 setStandardOutput。您是否尝试过 setStandardError 来查看是否出现了什么?
  • @ericgorr,嗨 - 我已经尝试过 setStandardError 并没有得到任何不同,但是,我回顾了我的控制台日志并注意到它出现了:/Data/*.jug: Not a directory - (这是一个目录,虽然 10.6.8 可能从最后的扩展中看不到它?)。
  • 如果您对 /Data 执行 ls -l,目录的条目是什么样的?

标签: objective-c cocoa nstask


【解决方案1】:

尝试使用以下引号:

'/Data/*.jug/files/' 

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

【讨论】:

    【解决方案2】:

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

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

    此外,您应该确保启用全局扩展(set +f in Bash)。

    因此,明确地使用 Bash shell 和 [task setLaunchPath: @"/bin/bash"]; 并开始测试你的 shell 代码:

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

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

    您也可以使用完整的可执行路径来绝对确定,例如。 G。 /usr/bin/find.

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

    编译器可能造成混淆的原因可能是 /Data/*.jug/files/ 中的 C 样式注释开头 /*

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

    您的代码在我的 Mac OS X 10.6.8 机器上使用 NSPipe - CocoaDev/usr/bin/gcc-4.2 中的 asynctask.m 作为编译器为我工作。

    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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 2016-08-06
      • 1970-01-01
      • 2017-02-15
      相关资源
      最近更新 更多