0

私は NSTask を使用してこれを行うためのソリューションを読みました:それらはすべて非常に長く見えます...したがって、このコードを使用してまったく同じことを行うことができました(標準出力と標準エラーの両方を取得します):

NSTask *task = [NSTask new];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:@[ @"-c", @"aCommand"]];
NSString *stringToRemove = [task description];
[task launch];
NSString *output = [[task description] stringByReplacingOccurrencesOfString:stringToRemove withString:@""];

このソリューションを使用することの欠点はありますか? 出力をフィルタリングするより短い方法はありますか?

4

1 に答える 1

3

このソリューションを使用することの欠点はありますか? 出力をフィルタリングするより短い方法はありますか?

はい、多くの欠点があります。descriptionタスクのコマンドラインと出力を魔法のように返す実装の詳細に依存しています。これはドキュメントでは主張されておらず、descriptionデバッグ/ロギング以外での使用は実際には受け入れられません。

つまり、そのコードは便宜上のみ機能します。

しかし、そのコードは実際には機能していません。実行するコマンドが終了しない、実行に時間がかかる、または大量の出力を生成する場合、そのコードは実際には出力をまったく取得しないか、切り捨てられた出力を吐き出す可能性があります。

NSTask使用する例が少し長くなる傾向があるのには理由があります。プロセス間の I/O を管理することは実際には非常に難しく、考慮に入れる必要があるさまざまなオプションがたくさんあります。

于 2013-03-19T14:53:26.343 に答える