2014-07-16 4 views
2

Я пытаюсь запустить perl regex один лайнер на кучу файлов в каталоге (через рекурсивную находку) и немного беспокоясь о том, что NSTask делает то, что одна строка в командной строке.NSTask вызов perl и piping в поиске не работает

Perl один вкладыш в терминале работает, а упрощенная NSTask, выполняющая команду в виде строки через оболочку, тоже работает.

команды Perl (работы)

perl -p -i -e 's/DEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";/DEBUG_INFORMATION_FORMAT = \"dwarf\";/g' `find . -name *.pbxproj` 

Простые NSTask (работы)

Использование Inket's answer from another question:

NSString *command = @"perl -p -i -e 's/DEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";/DEBUG_INFORMATION_FORMAT = \"dwarf\";/g' `find /Users/nflacco/Projects/XXX/XXX.xcodeproj -name *.pbxproj`"; 

NSTask* task = [[NSTask alloc] init]; 
[task setLaunchPath: @"/bin/sh"]; 
[task setArguments:@[@"-c", command]]; 
[task launch]; 

Xcode терминал приложение (не работает)

#import <Foundation/Foundation.h> 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
     NSString *workspacePath = @"/Users/nflacco/Projects/XXX/XXX.xcodeproj"; 

     NSString *old = @"DEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";"; 
     NSString *new = @"DEBUG_INFORMATION_FORMAT = \"dwarf\";"; 

     NSTask *task = [[NSTask alloc] init]; 
     [task setLaunchPath:@"/usr/bin/perl"]; 
     NSString *regex = [NSString stringWithFormat:@"'s/%@/%@/g'", old, new]; 
     NSString *pathArg = [NSString stringWithFormat:@"`find %@ -name *.pbxproj`", workspacePath]; 
     [task setArguments:@[ @"-p", @"-i", @"-e", regex, pathArg]]; 
     [task launch]; 

    } 
    return 0; 
} 

Xcode консоли:

Can't open `find /Users/nflacco/Projects/XXX/XXX.xcodeproj -name *.pbxproj`: No such file or directory. 
Program ended with exit code: 0 

ответ

2

Вы должны вызвать /bin/sh согласно вашему первому примеру кода. Это происходит из-за использования `, которое является выражением оболочки для выполнения подоболочки и эхо-вывода.

Поэтому:

NSString *workspacePath = @"/Users/nflacco/Projects/XXX/XXX.xcodeproj"; 

NSString *old = @"DEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";"; 
NSString *new = @"DEBUG_INFORMATION_FORMAT = \"dwarf\";"; 

NSTask *task = [[NSTask alloc] init]; 
[task setLaunchPath:@"/bin/sh"]; 
NSString *regex = [NSString stringWithFormat:@"'s/%@/%@/g'", old, new]; 
NSString *pathArg = [NSString stringWithFormat:@"`find %@ -name *.pbxproj`", workspacePath]; 
[task setArguments:@[ @"/usr/bin/perl", @"-p", @"-i", @"-e", regex, pathArg]]; 
[task launch]; 

еще лучше, чтобы сделать всю эту работу в вашем приложении ...

+0

Я пишу плагин для переключения различных настроек Xcode проекта (изменение параметров может привести к 60% -ное улучшение по времени сборки). В противном случае я просто проверил бы скрипт в репо проекта. – nflacco