1. ホーム
  2. オブジェクティブC

[解決済み】Cocoaアプリからターミナルコマンドを実行する

2022-04-10 02:13:23

質問

ターミナルコマンドを実行するには(例えば grep )をObjective-CのCocoaアプリケーションから削除することはできますか?

どのように解決するのですか?

を使用することができます。 NSTask . 以下は、' を実行する例です。 /usr/bin/grep foo bar.txt '.

int pid = [[NSProcessInfo processInfo] processIdentifier];
NSPipe *pipe = [NSPipe pipe];
NSFileHandle *file = pipe.fileHandleForReading;

NSTask *task = [[NSTask alloc] init];
task.launchPath = @"/usr/bin/grep";
task.arguments = @[@"foo", @"bar.txt"];
task.standardOutput = pipe;

[task launch];

NSData *data = [file readDataToEndOfFile];
[file closeFile];

NSString *grepOutput = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog (@"grep returned:\n%@", grepOutput);

NSPipeNSFileHandle は、タスクの標準出力をリダイレクトするために使われます。

Objective-C アプリケーションからオペレーティング システムとの対話に関するより詳細な情報については、Apple の Development Center にあるこのドキュメントを参照してください。 オペレーティング・システムとのインタラクション .

編集:NSLogの問題に対する修正を含む

NSTaskを使用してbash経由でコマンドラインユーティリティを実行している場合、NSLogの動作を維持するために、この魔法の行を含める必要があります。

//The magic line that keeps your log where it belongs
task.standardOutput = pipe;

解説はこちら https://web.archive.org/web/20141121094204/https://cocoadev.com/HowToPipeCommandsWithNSTask