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"を1つの引数として渡します。理解しなければならないもう一つのことは、引用の範囲外では、特殊文字をバックスラッシュエスケープすることができるということです。この結果は'one two'\''three four'のような文字列で、 "one two'three four"という文字列に評価され、一重引用符で囲まれます。このトリックを使用すると、すべてのシングルクォートをシーケンス'\''に置き換えて、すべての文字列を簡単に引用できます。その後、単一のシングルクォーテーションペアで文字列全体をラップします。

次の文字列を持っている場合:

I don't like shell quoting 

を、あなたが

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

で終わるこの単純な変換を適用し、これはシェルによって、元の文字列に戻って評価し、として扱います単一の引数。

NSStringの上、以下のカテゴリには、簡単にこの変換を行う必要があります。

@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 stringWithFormat:@" '%@' "、[string stringByReplacingOccurrencesOfString:@" '"withString:@"' \\ '']]] '(変更可能な文字列)でもあります。すべてをエスケープしない方法の1つは、多分エスケープされなければならないすべての文字を含むNSCharacterSetを使用することです。 – tig

+0

あなたの答えは本当に好きですが、皮肉なことに、あなたの事例、中間段落を「バックチック」するので、意図した「意味」を見分けるのが非常に難しくなります。 bash引用符は気まぐれな領域です。それは力のようなものです。それをマスターし、何かが可能です。 –

+0

これはあまり良いカテゴリーではないが、文字列paramを渡す代わりにselfを使うことになっている。 – malhal

0

NSStringhereのメソッドのリストを参照してください。多くの曖昧なものがありますが、あなたの仕事に合ったものはないと思います。自分で書く必要があります。

このメソッドが比較的まれにしか呼び出されない場合は、Objective-Cの内部からrubyバイナリを呼び出し、shellescapeを使用して結果を取得します。ホイールを再発明するのはばかげている。

関連する問題