कोको एप्लिकेशन से एक टर्मिनल कमांड निष्पादित करें


204

मैं grepअपने उद्देश्य-सी कोको आवेदन से एक टर्मिनल कमांड (जैसे ) कैसे निष्पादित कर सकता हूं ?


2
Im सिर्फ स्पष्ट बताते हुए: सैंडबॉक्सिंग के साथ आप केवल उन ऐप्स को शुरू नहीं कर सकते हैं जो आपके सैंडबॉक्स में नहीं हैं और उन्हें यह अनुमति देने के लिए आपके द्वारा हस्ताक्षरित होने की आवश्यकता है
Daij-Djan

@ Daij-Djan यह सच नहीं है, कम से कम macOS में नहीं। सैंडबॉक्स वाला macOS ऐप किसी भी बायनेरिज़ को उन जगहों पर चला सकता है, /usr/binजहाँ grepवह रहता है।
jeff-h

नहीं, कृपया मुझे गलत साबित करें; ist nstask पर आपके सैंडबॉक्स में कुछ भी चलाने में विफल रहेगा।
दै -जवान

जवाबों:


282

आप उपयोग कर सकते हैं 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);

NSPipeऔर NSFileHandleकार्य के मानक आउटपुट को पुनर्निर्देशित करने के लिए उपयोग किया जाता है।

आपके उद्देश्य-सी अनुप्रयोग के भीतर से ऑपरेटिंग सिस्टम के साथ बातचीत करने के बारे में अधिक विस्तृत जानकारी के लिए, आप इस दस्तावेज़ को Apple के विकास केंद्र पर देख सकते हैं: ऑपरेटिंग सिस्टम के साथ सहभागिता

संपादित करें: NSLog समस्या के लिए शामिल फिक्स

यदि आप bash के माध्यम से कमांड-लाइन यूटिलिटी को चलाने के लिए NSTask का उपयोग कर रहे हैं, तो आपको NSDog को रखने के लिए इस मैजिक लाइन को शामिल करने की आवश्यकता है:

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

एक स्पष्टीकरण यहाँ है: https://web.archive.org/web/20141121094204/https://cocoadev.com/HowToPipeCommandsWithNSTask


1
हाँ, 'तर्क = [NSArray arrayWithObjects: @ "- e", @ "foo", @ "bar.txt", nil];'
गॉर्डन विल्सन

14
आपके उत्तर में एक छोटी गड़बड़ है। NSPipe में एक बफर (OS स्तर पर सेट) होता है, जिसे पढ़ते ही फ्लश हो जाता है। यदि बफर भर जाता है, तो NSTask लटक जाएगा, और आपका ऐप भी अनिश्चित काल तक लटका रहेगा। कोई त्रुटि संदेश नहीं दिखाई देगा। यह तब हो सकता है जब NSTask बहुत अधिक जानकारी लौटाता है। समाधान का उपयोग करना है NSMutableData *data = [NSMutableData dataWithCapacity:512];। फिर, while ([task isRunning]) { [data appendData:[file readDataToEndOfFile]]; }। और मैं "विश्वास" करता हूं कि आपके पास [data appendData:[file readDataToEndOfFile]];लूप से बाहर निकलने के बाद एक और होना चाहिए ।
डेव गलाघेर

2
त्रुटियां तब तक सामने नहीं आएंगी जब तक आप ऐसा नहीं करते (वे सिर्फ लॉग में मुद्रित होते हैं): [कार्य सेटस्टैंडर एरर: पाइप];
माइक स्प्रैग

1
यह एआरसी और ओबज-सी सरणी के शाब्दिक के साथ अद्यतन किया जा सकता है। जैसे pastebin.com/sRvs3CqD
bames53

1
त्रुटियों को पाइप करना भी एक अच्छा विचार है। task.standardError = pipe;
वकदवे

43

kent के लेख ने मुझे एक नया विचार दिया। इस रनकमांड विधि को स्क्रिप्ट फ़ाइल की आवश्यकता नहीं है, बस एक लाइन द्वारा एक कमांड चलाता है:

- (NSString *)runCommand:(NSString *)commandToRun
{
    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath:@"/bin/sh"];

    NSArray *arguments = [NSArray arrayWithObjects:
                          @"-c" ,
                          [NSString stringWithFormat:@"%@", commandToRun],
                          nil];
    NSLog(@"run command:%@", commandToRun);
    [task setArguments:arguments];

    NSPipe *pipe = [NSPipe pipe];
    [task setStandardOutput:pipe];

    NSFileHandle *file = [pipe fileHandleForReading];

    [task launch];

    NSData *data = [file readDataToEndOfFile];

    NSString *output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return output;
}

आप इस विधि का उपयोग इस तरह कर सकते हैं:

NSString *output = runCommand(@"ps -A | grep mysql");

1
यह अधिकांश मामलों को अच्छी तरह से संभालता है, लेकिन अगर आप इसे लूप में चलाते हैं, तो यह अंततः बहुत सारे खुले फ़ाइल हैंडल के कारण एक अपवाद को जन्म देता है। जोड़कर तय किया जा सकता है: [फ़ाइल बंद करें]; readDataToEndOfFile के बाद।
डेविड स्टीन

@ डेविडवेटिन: मुझे लगता है कि रनओमैंड मेथड को रैप करने के लिए ऑटोरेलिज्पुल का इस्तेमाल करना बेहतर लगता है। दरअसल, उपरोक्त कोड गैर-एआरसी के रूप में अच्छी तरह से विचार नहीं करता है।
केनिअल

@ केनियल: ओह, यह एक बेहतर समाधान है। यह गुंजाइश छोड़ने पर तुरंत संसाधन भी जारी करता है।
डेविड स्टीन

/ बिन / पीएस: ऑपरेशन की अनुमति नहीं है, मुझे कोई सफलता नहीं मिल रही है, लीड?
नमन वैष्णव

40

साझा करने की भावना में ... यह एक ऐसी विधि है जिसका उपयोग मैं शेल स्क्रिप्ट चलाने के लिए अक्सर करता हूं। आप अपने उत्पाद बंडल में एक स्क्रिप्ट जोड़ सकते हैं (बिल्ड के कॉपी चरण में) और फिर स्क्रिप्ट को पढ़ने और रनटाइम पर चलाने के लिए है। नोट: यह कोड PrivateFrameworks उप-पथ में स्क्रिप्ट के लिए दिखता है। चेतावनी: यह तैनात उत्पादों के लिए एक सुरक्षा जोखिम हो सकता है, लेकिन हमारे इन-हाउस विकास के लिए यह सरल चीजों को अनुकूलित करने का एक आसान तरीका है (जैसे कि मेजबान को rsync ...) आवेदन को फिर से संकलित किए बिना, लेकिन सिर्फ संपादन बंडल में शेल स्क्रिप्ट।

//------------------------------------------------------
-(void) runScript:(NSString*)scriptName
{
    NSTask *task;
    task = [[NSTask alloc] init];
    [task setLaunchPath: @"/bin/sh"];

    NSArray *arguments;
    NSString* newpath = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] privateFrameworksPath], scriptName];
    NSLog(@"shell script path: %@",newpath);
    arguments = [NSArray arrayWithObjects:newpath, nil];
    [task setArguments: arguments];

    NSPipe *pipe;
    pipe = [NSPipe pipe];
    [task setStandardOutput: pipe];

    NSFileHandle *file;
    file = [pipe fileHandleForReading];

    [task launch];

    NSData *data;
    data = [file readDataToEndOfFile];

    NSString *string;
    string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
    NSLog (@"script returned:\n%@", string);    
}
//------------------------------------------------------

संपादित करें: NSLog समस्या के लिए शामिल फिक्स

यदि आप bash के माध्यम से कमांड-लाइन यूटिलिटी को चलाने के लिए NSTask का उपयोग कर रहे हैं, तो आपको NSDog को रखने के लिए इस मैजिक लाइन को शामिल करने की आवश्यकता है:

//The magic line that keeps your log where it belongs
[task setStandardInput:[NSPipe pipe]];

प्रसंग में:

NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];
//The magic line that keeps your log where it belongs
[task setStandardInput:[NSPipe pipe]];

एक स्पष्टीकरण यहाँ है: http://www.cocoadev.com/index.pl?NSTask


2
स्पष्टीकरण लिंक मृत है।
जॉनी

मैं इस कमांड "system_profiler SPApplicationsDataType -xml" को चलाना चाहता हूं, लेकिन मुझे यह त्रुटि "लॉन्च पथ सुलभ नहीं है" मिल रही है
विकास बंसल

25

यहाँ यह स्विफ्ट में कैसे करना है

स्विफ्ट 3.0 के लिए परिवर्तन:

  • NSPipe नाम बदल दिया गया है Pipe

  • NSTask नाम बदल दिया गया है Process


यह ऊपर इंकिट के ऑब्जेक्टिव-सी उत्तर पर आधारित है। उन्होंने कहा कि एक के रूप में यह लिखा श्रेणी पर NSString- स्विफ्ट के लिए, यह एक हो जाता है विस्तार की String

विस्तार String.runAsCommand () -> स्ट्रिंग

extension String {
    func runAsCommand() -> String {
        let pipe = Pipe()
        let task = Process()
        task.launchPath = "/bin/sh"
        task.arguments = ["-c", String(format:"%@", self)]
        task.standardOutput = pipe
        let file = pipe.fileHandleForReading
        task.launch()
        if let result = NSString(data: file.readDataToEndOfFile(), encoding: String.Encoding.utf8.rawValue) {
            return result as String
        }
        else {
            return "--- Error running command - Unable to initialize string from file data ---"
        }
    }
}

उपयोग:

let input = "echo hello"
let output = input.runAsCommand()
print(output)                        // prints "hello"

    या केवल:

print("echo hello".runAsCommand())   // prints "hello" 

उदाहरण:

@IBAction func toggleFinderShowAllFiles(_ sender: AnyObject) {

    var newSetting = ""
    let readDefaultsCommand = "defaults read com.apple.finder AppleShowAllFiles"

    let oldSetting = readDefaultsCommand.runAsCommand()

    // Note: the Command results are terminated with a newline character

    if (oldSetting == "0\n") { newSetting = "1" }
    else { newSetting = "0" }

    let writeDefaultsCommand = "defaults write com.apple.finder AppleShowAllFiles \(newSetting) ; killall Finder"

    _ = writeDefaultsCommand.runAsCommand()

}

Processपरिणाम को नोट करें जैसे Pipeकि एक NSStringऑब्जेक्ट से पढ़ा गया है । यह एक त्रुटि स्ट्रिंग हो सकता है और यह एक खाली स्ट्रिंग भी हो सकता है, लेकिन यह हमेशा एक होना चाहिए NSString

इसलिए, जब तक यह शून्य नहीं है, तब तक परिणाम एक स्विफ्ट के रूप में डाली जा सकती है Stringऔर वापस आ सकती है।

यदि किसी कारण NSStringसे फ़ाइल डेटा से आरंभ नहीं किया जा सकता है, तो फ़ंक्शन त्रुटि संदेश देता है। फ़ंक्शन को एक वैकल्पिक वापस करने के लिए लिखा जा सकता था String?, लेकिन यह उपयोग करने के लिए अजीब होगा और एक उपयोगी उद्देश्य की सेवा नहीं करेगा क्योंकि ऐसा होने की संभावना नहीं है।


1
वास्तव में अच्छा और सुरुचिपूर्ण तरीका है! इस उत्तर में अधिक उत्थान होना चाहिए।
XueYu

यदि आपको आउटपुट की आवश्यकता नहीं है। @DiscardableResult तर्क को रन-ऑफ या रनकमांड विधि से ऊपर जोड़ें। यह आपको एक चर में डालने के बिना विधि को कॉल करने देगा।
लॉयड कीइजर

परिणाम दें = स्ट्रिंग (बाइट्स: fileHandle.readDataToEndOfFile (), एन्कोडिंग: String.Encoding.utf8) ठीक है
क्लीक्सिआंग

18

उद्देश्य-सी (स्विफ्ट के लिए नीचे देखें)

शीर्ष उत्तर में कोड को साफ करने के लिए इसे अधिक पठनीय, कम निरर्थक बनाने के लिए, एक-लाइन पद्धति के लाभों को जोड़ा और एक NSString श्रेणी में बनाया गया

@interface NSString (ShellExecution)
- (NSString*)runAsCommand;
@end

कार्यान्वयन:

@implementation NSString (ShellExecution)

- (NSString*)runAsCommand {
    NSPipe* pipe = [NSPipe pipe];

    NSTask* task = [[NSTask alloc] init];
    [task setLaunchPath: @"/bin/sh"];
    [task setArguments:@[@"-c", [NSString stringWithFormat:@"%@", self]]];
    [task setStandardOutput:pipe];

    NSFileHandle* file = [pipe fileHandleForReading];
    [task launch];

    return [[NSString alloc] initWithData:[file readDataToEndOfFile] encoding:NSUTF8StringEncoding];
}

@end

उपयोग:

NSString* output = [@"echo hello" runAsCommand];

और अगर आपको आउटपुट एन्कोडिंग की समस्या हो रही है:

// Had problems with `lsof` output and Japanese-named files, this fixed it
NSString* output = [@"export LANG=en_US.UTF-8;echo hello" runAsCommand];

आशा है कि यह मेरे लिए उतना ही उपयोगी होगा जितना कि भविष्य के लिए। (हाय आप!)


स्विफ्ट 4

यहाँ की एक स्विफ्ट उदाहरण बनाने फायदा नहीं है Pipe, Processहै, औरString

extension String {
    func run() -> String? {
        let pipe = Pipe()
        let process = Process()
        process.launchPath = "/bin/sh"
        process.arguments = ["-c", self]
        process.standardOutput = pipe

        let fileHandle = pipe.fileHandleForReading
        process.launch()

        return String(data: fileHandle.readDataToEndOfFile(), encoding: .utf8)
    }
}

उपयोग:

let output = "echo hello".run()

2
वास्तव में, आपका कोड मेरे लिए बहुत उपयोगी था! मैंने इसे स्विफ्ट में बदल दिया और इसे नीचे एक और उत्तर के रूप में पोस्ट किया।
ElmerCat

14

कांटा , निष्पादन , और इंतजार करना चाहिए, अगर आप वास्तव में एक उद्देश्य-सी विशिष्ट तरीके की तलाश में नहीं हैं। forkवर्तमान में चल रहे कार्यक्रम की एक प्रति बनाता है, execवर्तमान में चल रहे कार्यक्रम को एक नए के साथ बदल देता है, और waitउपप्रक्रम से बाहर निकलने का इंतजार करता है। उदाहरण के लिए (बिना किसी त्रुटि जाँच के):

#include <stdlib.h>
#include <unistd.h>


pid_t p = fork();
if (p == 0) {
    /* fork returns 0 in the child process. */
    execl("/other/program/to/run", "/other/program/to/run", "foo", NULL);
} else {
    /* fork returns the child's PID in the parent. */
    int status;
    wait(&status);
    /* The child has exited, and status contains the way it exited. */
}

/* The child has run and exited by the time execution gets to here. */

सिस्टम भी है , जो कमांड चलाता है जैसे कि आपने इसे शेल के कमांड लाइन से टाइप किया है। यह सरल है, लेकिन स्थिति पर आपका नियंत्रण कम है।

मैं मान रहा हूं कि आप मैक एप्लिकेशन पर काम कर रहे हैं, इसलिए लिंक इन कार्यों के लिए Apple के डॉक्यूमेंटेशन के हैं, लेकिन वे सभी हैं POSIX, इसलिए आपको उन्हें किसी भी POSIX-compliant सिस्टम पर उपयोग करना चाहिए।


मुझे पता है कि यह एक बहुत पुराना उत्तर है, लेकिन मुझे यह कहने की आवश्यकता है: यह अतिउत्साह को संभालने के लिए ट्रहेड्स का उपयोग करने का एक शानदार तरीका है। केवल नकारात्मक पक्ष यह है कि यह पूरे कार्यक्रम की एक प्रति बनाता है। एक कोको आवेदन के लिए मैं एक अच्छे aproach के लिए @GordonWilson के साथ जाना होगा, और अगर मैं एक कमांड लाइन आवेदन पर काम कर रहा हूं तो यह सबसे अच्छा तरीका है। धन्यवाद (क्षमा करें मेरा बुरा अंग्रेजी)
निकोस करालिस

11

अच्छी पुरानी POSIX प्रणाली भी है ("इको-एन '007'");


6
इस कॉम से भागो मत। (यदि आप यह नहीं जानते कि यह आदेश क्या करता है)
justin

4
इसे थोड़ा सुरक्षित करने के लिए बदल दिया ... (यह beeps)
nes1983

क्या यह कंसोल में कोई त्रुटि नहीं करेगा? Incorrect NSStringEncoding value 0x0000 detected. Assuming NSStringEncodingASCII. Will stop this compatibility mapping behavior in the near future.
cwd

1
हम्म। हो सकता है कि आपको बैकस्लैश को दोबारा बचाना पड़े।
nes1983

बस चला / usr / बिन / गूंज या कुछ और। rm -rf कठोर है, और सांत्वना में यूनिकोड अभी भी बेकार है :)
मैक्सिम वीक्स्लर

8

मैंने यह "सी" फ़ंक्शन लिखा है, क्योंकि NSTaskअप्रिय है।

NSString * runCommand(NSString* c) {

    NSString* outP; FILE *read_fp;  char buffer[BUFSIZ + 1];
    int chars_read; memset(buffer, '\0', sizeof(buffer));
    read_fp = popen(c.UTF8String, "r");
    if (read_fp != NULL) {
        chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp);
        if (chars_read > 0) outP = $UTF8(buffer);
        pclose(read_fp);
    }   
    return outP;
}

NSLog(@"%@", runCommand(@"ls -la /")); 

total 16751
drwxrwxr-x+ 60 root        wheel     2108 May 24 15:19 .
drwxrwxr-x+ 60 root        wheel     2108 May 24 15:19 ..

ओह, और पूरा होने के लिए / असंदिग्ध ...

#define $UTF8(A) ((NSString*)[NSS stringWithUTF8String:A])

वर्षों बाद, Cअभी भी मेरे साथ एक घिनौना खिलवाड़ है, और ऊपर मेरी सकल कमियों को ठीक करने की मेरी क्षमता पर थोड़ा विश्वास के साथ - केवल जैतून की एक शाखा जो मैं प्रदान करता हूं, वह @ inket के जवाब का एक rezhuzhed संस्करण है जो हड्डियों का सबसे अच्छा है , मेरे साथी के लिए शुद्धतावादी / वाचालता-नफरत करने वाले ...

id _system(id cmd) { 
   return !cmd ? nil : ({ NSPipe* pipe; NSTask * task;
  [task = NSTask.new setValuesForKeysWithDictionary: 
    @{ @"launchPath" : @"/bin/sh", 
        @"arguments" : @[@"-c", cmd],
   @"standardOutput" : pipe = NSPipe.pipe}]; [task launch];
  [NSString.alloc initWithData:
     pipe.fileHandleForReading.readDataToEndOfFile
                      encoding:NSUTF8StringEncoding]; });
}

1
outP किसी भी त्रुटि पर अपरिभाषित है, chars_read किसी भी आर्किटेक्चर पर size (ssize_t) = = sizeof (int) पर fread () के रिटर्न वैल्यू के लिए बहुत छोटा है, अगर हम UFSSIZ बाइट्स से अधिक आउटपुट चाहते हैं, तो क्या होगा? क्या होगा यदि आउटपुट UTF-8 नहीं है? क्या होगा यदि pclose () एक त्रुटि लौटाता है? हम भय () की त्रुटि की रिपोर्ट कैसे करते हैं?
ऑब्जेक्टिव-ओडर

@ ऑब्जेक्टिव-ओडर डी'हॉ - आई डननो। कृपया, मुझे बताएं (के रूप में .. दूर संपादित करें)!
एलेक्स ग्रे

3

कस्टोस मोर्टेम ने कहा:

मुझे आश्चर्य है कि कोई भी वास्तव में अवरुद्ध / गैर-अवरुद्ध कॉल समस्याओं में नहीं आया

NSTaskनीचे पढ़ने से संबंधित कॉल समस्याओं को अवरुद्ध / गैर-अवरुद्ध करने के लिए :

asynctask.m - नमूना कोड जो दिखाता है कि NSTask के साथ डेटा को संसाधित करने के लिए अतुल्यकालिक स्टड, स्टडआउट और स्टेडर धाराओं को कैसे लागू किया जाए।

GynHub पर asynctask.m का सोर्स कोड उपलब्ध है


एक गैर-अवरुद्ध संस्करण के लिए मेरा योगदान देखें
गुरुनिवर्स

3

उपरोक्त कई उत्कृष्ट उत्तरों के अलावा, मैं पृष्ठभूमि में कमांड के आउटपुट को संसाधित करने और अवरुद्ध तंत्र से बचने के लिए निम्न कोड का उपयोग करता हूं [file readDataToEndOfFile]

- (void)runCommand:(NSString *)commandToRun
{
    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath:@"/bin/sh"];

    NSArray *arguments = [NSArray arrayWithObjects:
                          @"-c" ,
                          [NSString stringWithFormat:@"%@", commandToRun],
                          nil];
    NSLog(@"run command:%@", commandToRun);
    [task setArguments:arguments];

    NSPipe *pipe = [NSPipe pipe];
    [task setStandardOutput:pipe];

    NSFileHandle *file = [pipe fileHandleForReading];

    [task launch];

    [self performSelectorInBackground:@selector(collectTaskOutput:) withObject:file];
}

- (void)collectTaskOutput:(NSFileHandle *)file
{
    NSData      *data;
    do
    {
        data = [file availableData];
        NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] );

    } while ([data length] > 0); // [file availableData] Returns empty data when the pipe was closed

    // Task has stopped
    [file closeFile];
}

मेरे लिए वह रेखा जिसने सभी अंतरों को बनाया था [self performSelectorInBackground: @selector (collectTaskOutput :) withObject: file];
नेविन्स्टन

2

या चूँकि ऑब्जेक्टिव C सिर्फ कुछ OO लेयर के साथ C के ऊपर है, तो आप पॉसिक्स कॉन्टेरपर्स का उपयोग कर सकते हैं:

int execl(const char *path, const char *arg0, ..., const char *argn, (char *)0);
int execle(const char *path, const char *arg0, ..., const char *argn, (char *)0, char *const envp[]);
int execlp(const char *file, const char *arg0, ..., const char *argn, (char *)0);
int execlpe(const char *file, const char *arg0, ..., const char *argn, (char *)0, char *const envp[]);
int execv(const char *path, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]); 

वे unistd.h हेडर फ़ाइल से शामिल हैं।


2

यदि टर्मिनल कमांड के लिए प्रशासक विशेषाधिकार (उर्फ sudo) की आवश्यकता होती है , तो AuthorizationExecuteWithPrivilegesइसके बजाय उपयोग करें । निम्नलिखित "com.stackoverflow.test" नामक एक फ़ाइल बनाएगा जो रूट डायरेक्टरी है / "सिस्टम / लाइब्रेरी / कैश"।

AuthorizationRef authorizationRef;
FILE *pipe = NULL;
OSStatus err = AuthorizationCreate(nil,
                                   kAuthorizationEmptyEnvironment,
                                   kAuthorizationFlagDefaults,
                                   &authorizationRef);

char *command= "/usr/bin/touch";
char *args[] = {"/System/Library/Caches/com.stackoverflow.test", nil};

err = AuthorizationExecuteWithPrivileges(authorizationRef,
                                         command,
                                         kAuthorizationFlagDefaults,
                                         args,
                                         &pipe); 

4
यह ओएस एक्स 10.7 के बाद से आधिकारिक तौर पर हटा दिया गया है
सैम वॉशबर्न

2
.. लेकिन यह परवाह किए बिना काम करता रहता है, क्योंकि यह ऐसा करने का एकमात्र तरीका है, और कई इंस्टॉलर उस पर भरोसा करते हैं, मुझे विश्वास है।
थॉमस टेम्प्लेमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.