Hatena::ブログ(Diary)

Watsonのメモ RSSフィード

2010-03-24

NSTaskで外部コマンドを実行するときには"/bin/sh -c"を経由させると幸せらしい

NSTaskで外部コマンドを実行する場合、外部コマンドをフルパスで指定しないといけないらしい。マシン環境によってコマンドはマシンによって"/opt/local/bin"だったり"/usr/local/bin"だったりするので、フルパスでコマンドを指定すると動かなかったりするので、"/bin/sh -c"を経由させてコマンドの実行パスを解決すると幸せになれるみたいです。

#import <Foundation/Foundation.h>

int main(void)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSTask *task  = [[NSTask alloc] init];
    NSPipe *pipe  = [[NSPipe alloc] init];

    [task setLaunchPath: @"/bin/sh"];
    [task setArguments: [NSArray arrayWithObjects: @"-c", @"cd ~/tmp; git add .; git commit -m 'Commit from NSTask'; git log > log.txt", nil]];

    [task setStandardOutput: pipe];
    [task launch];

    NSFileHandle *handle = [pipe fileHandleForReading];
    NSData *data = [handle  readDataToEndOfFile];
    NSString *result = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];

    NSLog(@"%@", result);

    [task release];
    [pipe release];

    [pool release];
}

"/bin/sh -c"を経由させると、コマンドを";"で区切れば一度に複数のコマンドを実行できたり、"cd"のようなシェル組み込みコマンドも実行できるおまけ付き。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証