2014-07-16 8 views
2

(재귀 적 검색을 통해) 디렉토리의 파일 묶음에서 perl 정규식 하나의 라이너를 실행하고 NSTask를 사용하여 한 줄을 처리하는 데 어려움이 있습니다. 명령 줄에서 않습니다.NSTask perl을 호출하고 파이핑이 작동하지 않음을 찾았습니다.

터미널의 펄 라이너가 작동하고 쉘을 통해 명령을 문자열로 실행하는 단순화 된 NSTask도 작동합니다.

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

엑스 코드 터미널 응용 프로그램 (작동하지 않습니다)

,
#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; 
} 

엑스 코드 콘솔 :

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를 호출해야합니다. 이는`which를 사용하여 서브 쉘을 실행하고 출력을 에코하는 쉘 표현식이기 때문입니다.

그러므로 : 더 나은 여전히 ​​응용 프로그램 내에서 모든 작업을 수행하는 것입니다

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