どのようにObjectivesCのシェルコマンドの引数をエスケープしますか?Objective-Cシェルエスケープ
ルビーライブラリはShellwords
(NSStringのためshellescape
、NSArrayのためshelljoin
、私はshellsplit
を必要としない)を持っています。そして、実際にはエスケープされた文字列が必要です.NSTaskについて知っています。私はそのコマンドを実行する必要はありません。
どのようにObjectivesCのシェルコマンドの引数をエスケープしますか?Objective-Cシェルエスケープ
ルビーライブラリはShellwords
(NSStringのためshellescape
、NSArrayのためshelljoin
、私はshellsplit
を必要としない)を持っています。そして、実際にはエスケープされた文字列が必要です.NSTaskについて知っています。私はそのコマンドを実行する必要はありません。
シングルクォートを使用すると、シェルのコンテンツをエスケープするのは簡単です。シェルのクォートを理解する上で重要なことは、文字列を同じ引用符で引用符の異なるスタイルや、引用符で囲まれていない文字列でも連結できることです。たとえば、'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
NSString
hereのメソッドのリストを参照してください。多くの曖昧なものがありますが、あなたの仕事に合ったものはないと思います。自分で書く必要があります。
このメソッドが比較的まれにしか呼び出されない場合は、Objective-Cの内部からruby
バイナリを呼び出し、shellescape
を使用して結果を取得します。ホイールを再発明するのはばかげている。
を、私はこの方法を考えたが、私はすべての引数が単一引用符でなることを好きではありません。また、より短いバリアントは '[NSString stringWithFormat:@" '%@' "、[string stringByReplacingOccurrencesOfString:@" '"withString:@"' \\ '']]] '(変更可能な文字列)でもあります。すべてをエスケープしない方法の1つは、多分エスケープされなければならないすべての文字を含むNSCharacterSetを使用することです。 – tig
あなたの答えは本当に好きですが、皮肉なことに、あなたの事例、中間段落を「バックチック」するので、意図した「意味」を見分けるのが非常に難しくなります。 bash引用符は気まぐれな領域です。それは力のようなものです。それをマスターし、何かが可能です。 –
これはあまり良いカテゴリーではないが、文字列paramを渡す代わりにselfを使うことになっている。 – malhal