2011-01-21 2 views
4

ObjectivesC에서 셸 명령에 대한 인수를 어떻게 이스케이프합니까?Objective-C 셸 이스케이프

루비 라이브러리는 Shellwords (있는 NSString에 대한 shellescape, NSArray를위한 shelljoin, 내가 shellsplit 필요하지 않습니다)가 있습니다. 그리고 실제로는 이스케이프 된 문자열이 필요합니다. NSTask에 대해 알고 있습니다. 명령을 실행할 필요가 없습니다.

답변

4

작은 따옴표를 사용하면 쉘 내용을 이스케이프 처리하는 것이 매우 쉽습니다. 셸 따옴표에 대해 이해해야 할 중요한 점은 동일한 인수에서 문자열을 다른 인용 스타일이나 심지어 따옴표로 묶지 않은 문자열로 연결할 수 있다는 것입니다. 예를 들어, 'one two'three" four"은 3 개의 모든 인용 스타일을 혼합하고 "one twothree four"문자열을 하나의 인수로 전달합니다. 이해해야 할 다른 점은 따옴표 밖에서는 특수 문자를 백 슬래시로 이스케이프 처리 할 수 ​​있다는 것입니다. 이 결과는 'one two'\''three four'과 같은 문자열로, "one two'three four"문자열로 평가되며 작은 따옴표로 나타납니다. 이 트릭을 사용하면 작은 따옴표를 모두 시퀀스 '\''으로 바꾸고 작은 따옴표로 전체 문자열을 래핑하여 문자열을 쉽게 인용 할 수 있습니다.

다음과 같은 문자열이있는 경우 :

I don't like shell quoting 

을 당신은 당신이

'I don'\''t like shell quoting' 

로 끝날 간단한 변환을 적용하고이 쉘에 의해 원래의 문자열로 다시 평가로 처리됩니다 하나의 인수.

@implementation NSString (ShellQuoting) 
// prefixed with "my", replace with your prefix of choice 
- (NSString *)myStringByShellquotingString:(NSString *)str { 
    NSMutableString *result = [NSMutableString stringWithString:str]; 
    [result replaceOccurrencesOfString:@"'" withString:@"'\\''" options:0 range:NSMakeRange(0, [result length])]; 
    [result insertString:@"'" atIndex:0]; 
    [result appendString:@"'"]; 
    return result; 
} 
@end 
+1

내가 이런 식으로 생각,하지만 난 모든 인수가 따옴표로 될 것 좋아하지 않는다 :

있는 NSString에 다음 카테고리는 쉽게 변환을 수행해야한다. 또한 더 짧은 변형은'[NSString stringWithFormat : @ " '% @'", [string stringByReplacingOccurrencesOfString : @ " '"withString : @ "'\\" ']]]'(또한 변경 가능한 문자열이 아님)입니다. 모든 것을 벗어나지 않는 한 가지 방법은 NSCharacterSet을 이스케이프해야하고 일치하는 경우에만 이스케이프해야하는 모든 문자와 함께 사용하는 것입니다. – tig

+0

답변을 정말 좋아하지만 아이러니하게도 많은 의미를 잃어 버립니다. 예를 들어, 중간 단락의 "뒤로 물음표'"하기 때문에 의도 한 "의미"를 식별하기가 매우 어렵습니다. bash 인용은 이상한 영역입니다. 그것은 힘과 같습니다. 그것을 마스터하십시오 - 그리고 모든 것이 가능합니다. –

+0

아주 좋은 카테고리는 아니지만 문자열 param을 전달하는 대신 self를 사용한다고 가정합니다. – malhal

0

NSStringhere의 메소드 목록을 참조하십시오. 많은 애매한 것들이 있지만, 나는 당신의 직업에 맞는 것이 있다고 생각하지 않습니다. 너는 너 자신을 써야한다.

그 방법이 상대적으로 드물게 호출되는 경우 Objective-C 내부에서 ruby 바이너리를 호출하고 shellescape을 사용하여 결과를 검색하면됩니다. 바퀴를 다시 발명하는 것은 어리 석다.