• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Shell Script in Cocoa und Ergebins abfangen

jack.jack

Klarapfel
Registriert
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?
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
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
 

jack.jack

Klarapfel
Registriert
20.03.09
Beiträge
280
Wie kann ich das Ergebnis jetzt in ein Text-Feld hineinschreiben?
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Wie kann ich das Ergebnis jetzt in ein Text-Feld hineinschreiben?
So, wie jeden anderen String auch ;) … auch nach 100 Mal fragst Du Dich immer noch durch.

NSData > NSString > NSTextField -setStringValue
 

jack.jack

Klarapfel
Registriert
20.03.09
Beiträge
280
Also so?

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

jack.jack

Klarapfel
Registriert
20.03.09
Beiträge
280
Tschuldigung über den Smiley. Er wurde automatisch generiert aus : und (
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
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:

NSData > NSString > NSTextField -setStringValue
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Alternative wäre auch popen (3)

Alex
 

jack.jack

Klarapfel
Registriert
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];
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Juhu, sogar ohne Leak :) Sehr schön.

Viele Grüße
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Juhu, sogar ohne Leak :) Sehr schön.
:)

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 …
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
:)

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 …
Apropo Feinheiten. stringWithUTF8String: erwartet einen NULL terminierten String.

MacApple
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Stimmt, wird der denn nicht automatisch über die Pipe gesendet?
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.

Der Absender übergibt ja schließlich seinerzeit eine \0
Tut er das wirklich/immer?

MacApple
 

jack.jack

Klarapfel
Registriert
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.
 

jack.jack

Klarapfel
Registriert
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?
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
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?

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
 

jack.jack

Klarapfel
Registriert
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.