Nstask не работает на более старой версии Mac OSX

У меня очень странная проблема с методом, который содержит 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, я получу результаты, которые я ожидал получить в своем приложении. Я в полной растерянности и очень надеюсь, что кто-то может пролить свет на эту проблему и как ее исправить.


person Jack Handy    schedule 01.01.2013    source источник
comment
Я вижу, что вы используете setSTandardInput и setStandardOutput. Вы пробовали setStandardError, чтобы увидеть, появляется ли что-нибудь?   -  person ericg    schedule 02.01.2013
comment
@ericgorr, привет - я пробовал setStandardError и не получил ничего другого, однако я заглянул в журналы своей консоли и заметил, что это отображается: /Data/*.jug: Not a directory - (это каталог, хотя 10.6.8 его не видит этак наверно от расширения на конце?).   -  person Jack Handy    schedule 02.01.2013
comment
Если вы сделаете ls -l для /Data, как будет выглядеть запись для каталога?   -  person ericg    schedule 07.01.2013


Ответы (2)


Попробуйте использовать такие цитаты:

'/Data/*.jug/files/' 

or

 \"/Data/*.jug/files/\"
person Alan    schedule 02.01.2013

Сообщение об ошибке /Data/*.jug: Not a directory обычно появляется, когда нет файлов, которые должны соответствовать расширению glob оболочки, а литерал /Data/*.jug передается команде, для которой в качестве аргумента требуется существующий файл или каталог.

Используя оболочку Bash, вы можете избежать ошибок такого рода, используя shopt -s nullglob.

Кроме того, вы должны убедиться, что расширение глобуса включено (set +f в Bash).

Поэтому явно используйте оболочку Bash с [task setLaunchPath: @"/bin/bash"]; и начните тестирование кода оболочки с помощью:

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

Затем шаг за шагом добавляйте и тестируйте каждую последующую команду вашего шелл-кода.

Вы также можете использовать полные пути к исполняемому файлу, чтобы быть абсолютно уверенным, например. г. /usr/bin/find.

В вашей команде awk замените $1 на $0, если имя файла содержит пробел.

Возможным источником путаницы для компилятора может быть начало комментария в стиле C /* в /Data/*.jug/files/.

Чтобы получить больше выходной информации, используйте команды оболочки в подробном режиме, если это возможно, например. г. cp -v и bash -xv -c.

Ваш код работал у меня на моем компьютере с Mac OS X 10.6.8 с использованием asynctask.m из NSPipe — CocoaDev и /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];
person marco    schedule 18.01.2013