NSTask в Objective-C

Итак, я пытаюсь запустить некоторые команды терминала из своей программы и получаю несколько запутанных ошибок.

Я новый разработчик, работающий с Java, поэтому я могу что-то упустить.

Вот код:

NSTask *task = [[NSTask alloc] init];
NSString *commitText = [commitMessage stringValue];
NSString *a = [NSString stringWithFormat:@"cd %@", dirPath];
NSString *c = [NSString stringWithFormat:@"git commit -m '%@'", commitText];
NSArray *commands = [[NSArray alloc]initWithObjects:a,
                     @"git add 'Project'",
                     c,
                     @"git push origin HEAD",
                     nil];
[task setLaunchPath:@"/bin/sh"];

// Do commands
NSArray *args = [NSArray arrayWithObjects:commands,
                 nil];

[task setArguments: args];
[task launch];

И вот ошибки:

2012-06-09 08:35:20.561 Auto Git[5433:403] -[__NSArrayI fileSystemRepresentation]:                 unrecognized selector sent to instance 0x7fb250d6a1e0
2012-06-09 08:35:20.561 Auto Git[5433:403] -[__NSArrayI fileSystemRepresentation]: unrecognized selector sent to instance 0x7fb250d6a1e0
2012-06-09 08:35:20.679 Auto Git[5433:403] (
  0   CoreFoundation                      0x00007fff870b4f56 __exceptionPreprocess + 198
  1   libobjc.A.dylib                     0x00007fff90e35d5e objc_exception_throw + 43
  2   CoreFoundation                      0x00007fff871411be -[NSObject doesNotRecognizeSelector:] + 190
  3   CoreFoundation                      0x00007fff870a1e23 ___forwarding___ + 371
  4   CoreFoundation                      0x00007fff870a1c38 _CF_forwarding_prep_0 + 232
  5   Foundation                          0x00007fff9174f3a3 -[NSConcreteTask launchWithDictionary:] + 901
  6   Auto Git                            0x000000010d83c6db -[Push push:] + 571
  7   CoreFoundation                      0x00007fff870a470d -[NSObject performSelector:withObject:] + 61
  8   AppKit                              0x00007fff8e0f8f7e -[NSApplication sendAction:to:from:] + 139
  9   AppKit                              0x00007fff8e0f8eb2 -[NSControl sendAction:to:] + 88
  10  AppKit                              0x00007fff8e0f8ddd -[NSCell _sendActionFrom:] + 137
  11  AppKit                              0x00007fff8e0f82a0 -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 2014
  12  AppKit                              0x00007fff8e177fc4 -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 489
  13  AppKit                              0x00007fff8e0f6eaa -[NSControl mouseDown:] + 786
  14  AppKit                              0x00007fff8e0c2348 -[NSWindow sendEvent:] + 6306
  15  AppKit                              0x00007fff8e05ba55 -[NSApplication sendEvent:] + 5593
  16  AppKit                              0x00007fff8dff20c6 -[NSApplication run] + 555
  17  AppKit                              0x00007fff8e26e244 NSApplicationMain + 867
  18  Auto Git                            0x000000010d83bff2 main + 34
  19  Auto Git                            0x000000010d83bfc4 start + 52
  20  ???                                 0x0000000000000003 0x0 + 3
 )

Спасибо!


person Community    schedule 09.06.2012    source источник


Ответы (2)


Ваш массив аргументов содержит массив. Это должен быть массив строк. Используйте свой объект commands в качестве этого параметра для NSTask.

person Community    schedule 09.06.2012

Я думаю, проблема в том, что вы передаете массив с массивом строк в setArguments. Вы должны передавать массив только со строками, а не с вложенным массивом.

Но я думаю, вы неправильно понимаете, как работают аргументы NSTask. Вероятно, вам следует сделать что-то вроде этого:

[task setArguments:[[[NSArray alloc] initWithObjects:
                     @"git", @"add", @"Project", nil]
                    autorelease]];

И т. д., или если вы действительно хотите использовать sh, вам, вероятно, потребуется добавить ; для разделения команд оболочки.

person Mattias Wadman    schedule 09.06.2012
comment
Спасибо. У меня также проблема с cd %@, dirPath, потому что он говорит, что такого каталога нет Пример /bin/sh: cd /Users/webstreet/Documents/GIT/findmycar: Нет такого файла или каталога - person ; 09.06.2012
comment
Разве вы не должны использовать параметры -c для sh также? - person Mattias Wadman; 09.06.2012
comment
я не совсем знаю, я новичок в ш - person ; 09.06.2012
comment
Ok. Я думаю, вам следует прочитать о -c в справочная страница для sh. Попробуйте интерактивную оболочку, если хотите проверить, как она себя ведет. Подсказка: sh -c echo test не сработает, а sh -c "echo test" сработает. Но я думаю, что более надежным решением в вашем случае будет выполнение каждой команды как отдельных NSTask launch:s. Другое решение состоит в том, чтобы включить в ваше приложение вспомогательный сценарий оболочки, который принимает dirPath и commitText в качестве аргументов и выполняет команды, а затем запускает один NSTask для его запуска. - person Mattias Wadman; 09.06.2012