1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Shell Script in Cocoa und Ergebins abfangen

Dieses Thema im Forum "OS X-Developer" wurde erstellt von jack.jack, 29.09.09.

  1. jack.jack

    jack.jack Klarapfel

    Dabei seit:
    20.03.09
    Beiträge:
    280
    Wie kann ich in einer Cocoa-Applikation ein Shell Script ausführen und danach das Ergebnis in eine Variable speichern?
     
  2. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    Hallo,

    so wie Du es schon mal erledigt hast ;)

    Mit NSTask und NSPipe.

    Teilausschnitt - Beispiel:

    Code:
    			// Task anlegen
    			NSTask *theTask = [[[NSTask alloc] init] autorelease];
    			[theTask setLaunchPath: @"/usr/bin/find"];
    			
    			// Parameter festlegen
    			[theTask setArguments:theTaskArguments];
    			
    			// Pipe anlegen
    			NSPipe *thePipe = [NSPipe pipe];
    			[theTask setStandardOutput:thePipe];
    			
    			// Error Pipe
    			NSPipe *theErrorPipe = [NSPipe pipe];
    			[theTask setStandardError:theErrorPipe];
    			
    			// Handle zum Lesen erzeugen
    			NSFileHandle *theFileHandle = [thePipe fileHandleForReading];
    			
    			// Task starten
    			[theTask launch];
    			
    			// Ausgabe lesen
    			NSData *theReadData = [theFileHandle readDataToEndOfFile];

    Viele Grüße
     
  3. jack.jack

    jack.jack Klarapfel

    Dabei seit:
    20.03.09
    Beiträge:
    280
    Wie kann ich das Ergebnis jetzt in ein Text-Feld hineinschreiben?
     
  4. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    So, wie jeden anderen String auch ;) … auch nach 100 Mal fragst Du Dich immer noch durch.

    NSData > NSString > NSTextField -setStringValue
     
  5. jack.jack

    jack.jack Klarapfel

    Dabei seit:
    20.03.09
    Beiträge:
    280
    Also so?

    NSData *theReadData = [theFileHandle readDataToEndOfFile];
    [thetext setStringValue:(*theReadData];
     
  6. jack.jack

    jack.jack Klarapfel

    Dabei seit:
    20.03.09
    Beiträge:
    280
    Tschuldigung über den Smiley. Er wurde automatisch generiert aus : und (
     
  7. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    -setStringValue, da steckr schon im Namen das Wort String. Du willst dem aber Data geben?

    Ich habe Dir geschrieben welchen Weg Du gehen sollst/kannst:

     
  8. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Alternative wäre auch popen (3)

    Alex
     
  9. jack.jack

    jack.jack Klarapfel

    Dabei seit:
    20.03.09
    Beiträge:
    280
    Was meinst du damit?
     
  10. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
  11. jack.jack

    jack.jack Klarapfel

    Dabei seit:
    20.03.09
    Beiträge:
    280
    Stimmt es jetzt?

    NSData *theReadData = [theFileHandle readDataToEndOfFile];
    NSString *thestring = [[[NSString alloc] initWithData:theReadData encoding:NSUTF8StringEncoding] autorelease];
    [thetext setStringValue:thestring];
     
  12. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    Juhu, sogar ohne Leak :) Sehr schön.

    Viele Grüße
     
  13. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    :)

    Wobei ich zu

    NSString *thestring = [NSString stringWithUTF8TString:[theReadData bytes]];

    tendieren würde. Das macht dem String etwas weniger Arbeit uns ist auch kürzer. Aber wenn wir schon bei diesen Feinheiten angelangt sind …
     
  14. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Apropo Feinheiten. stringWithUTF8String: erwartet einen NULL terminierten String.

    MacApple
     
  15. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Stimmt, wird der denn nicht automatisch über die Pipe gesendet? Der Absender übergibt ja schließlich seinerzeit eine \0
     
  16. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    readDataToEndOfFile liest bis zu einem end-of-file Indikator (ist der \0 oder vielleicht doch 0x04 (EOF bzw. EOT)?). Nach meinen Erfahrungen mit NSTask/NSFileHandle, landet dieser Indikator jedenfalls nicht im NSData Objekt. Das letzte Byte im NSData Objekt ist daher nicht sicher \0.

    Tut er das wirklich/immer?

    MacApple
     
  17. jack.jack

    jack.jack Klarapfel

    Dabei seit:
    20.03.09
    Beiträge:
    280
    Es geht jetzt eigentlich, doch jetzt soll er folgenden Skript ausführen:

    "/usr/bin/security execute-with-privileges /usr/sbin/bless --setBoot --legacy --legacydrivehint /dev/disk0s3 --device /dev/disk0s3"

    Doch es geht nicht.
     
  18. jack.jack

    jack.jack Klarapfel

    Dabei seit:
    20.03.09
    Beiträge:
    280
    Es funktioniert jetzt schön und gut, doch ich wollte jetzt folgendes Kommando ausführen und bin daran gescheitert:
    echo 'Hallo' | sed "s/H$//"
    Das kann ich nicht so machen, weil ich die Argumente ja danach gesetzt werden. Wie kann ich diesen Befehl trotzdem ausführen?
     
  19. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Sei genau und informativ bei der Beschreibung deines Problems
    Beschreibe die Symptome deines Fehlers oder Problems sorgfältig und klar.
    Beschreibe die Umgebung, in der es auftaucht (Maschine, Betriebssystem, Applikation, was auch immer). Nenne auch die verwendete Distribution mit Versionsnummer (z.B. "Fedora Core 4", "Slackware 9.1", etc.).
    Beschreibe, welche Versuche du unternommen hast, um das Problem zu verstehen, bevor du gefragt hast.
    Beschreibe, welche Versuche du unternommen hast, um das Problem zu lösen, bevor du gefragt hast.
    Beschreibe die letzten Änderungen an deinem Computer oder deinen Softwareeinstellungen, die dir relevant erscheinen.
    http://www.tty1.net/smart-questions_de.html#beprecise


    Alex
     
  20. jack.jack

    jack.jack Klarapfel

    Dabei seit:
    20.03.09
    Beiträge:
    280
    Der Befehl soll in einer Cocoa-Applikation in Objective-C ausgeführt werden. Ich müsste es ja irgenwie so machen: NSTask *task = [NSTask alloc];
    [task setLaunchPath: @"/bin/echo"];
    [task setArguments [NSArray arrayWithObjects:
    @"Hallo",
    @" | sed s/&H$//"
    ]];

    Aber das geht nicht, da in der Ausgabe dann der zweite Befehl einfach geschrieben ist.
     

Diese Seite empfehlen