objective c نستاسك لا التقاط $ باث من بيئة المستخدم




objective-c cocoa (4)

لا أعرف لماذا تعيد هذه الطريقة سلسلة فارغة:

- (NSString *)installedGitLocation {
    NSString *launchPath = @"/usr/bin/which";

    // Set up the task
    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath:launchPath];
    NSArray *args = [NSArray arrayWithObject:@"git"];
    [task setArguments:args];

    // Set the output pipe.
    NSPipe *outPipe = [[NSPipe alloc] init];
    [task setStandardOutput:outPipe];

    [task launch];

    NSData *data = [[outPipe fileHandleForReading] readDataToEndOfFile];
    NSString *path = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

    return path;
}

إذا بدلا من تمرير @"git" كحجة، وأنا تمرير @"which" احصل على /usr/bin/which عاد كما هو متوقع. حتى على الأقل الأعمال المبدأ.

من المحطة

$ which which
$ /usr/bin/which
$
$ which git
$ /usr/local/git/bin/git

لذلك يعمل هناك.

الشيء الوحيد الذي يمكن أن أفكر به هو أن which لا يبحث من خلال جميع المسارات في بيئتي.

هذا يقودني للجنون! هل لدى أي شخص أي أفكار؟

إديت: يبدو أن هذا هو حول إعداد إما نستسك ​​أو قذيفة المستخدم (على سبيل المثال، ~ / .bashrc) بحيث ينظر إلى البيئة الصحيحة ($ باث) من قبل نستاسك.


محاولة،

    [task setLaunchPath:@"/bin/bash"];
    NSArray *args = [NSArray arrayWithObjects:@"-l",
                     @"-c",
                     @"which git",
                     nil];
    [task setArguments: args];

هذا عملت بالنسبة لي على سنو ليوبارد. لم اختبر على أي نظام آخر. و -l (حرف L صغير) يخبر باش إلى "التصرف كما لو كان قد تم استدعاء كقذيفة تسجيل الدخول"، وفي العملية التي التقطت بلدي باث العادي $. هذا لا يعمل بالنسبة لي إذا تم تعيين مسار الإطلاق إلى / بت / ش، حتى مع -l.


هل / أسر / لوكال / جيت / بن في باث $ عند تشغيل البرنامج؟ أعتقد which يبدو فقط في باث $ للمستخدم.



تشغيل مهمة عبر نستسك ​​يستخدم fork() و exec() لتشغيل فعلا المهمة. لا تشارك قذيفة تفاعلية المستخدم على الإطلاق. منذ $PATH هو (بشكل عام) مفهوم قذيفة، فإنه لا ينطبق عندما كنت تتحدث عن تشغيل العمليات بطريقة أخرى.





nstask