• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

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?
 
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
 
Wie kann ich das Ergebnis jetzt in ein Text-Feld hineinschreiben?
 
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
 
Also so?

NSData *theReadData = [theFileHandle readDataToEndOfFile];
[thetext setStringValue:(*theReadData];
 
Tschuldigung über den Smiley. Er wurde automatisch generiert aus : und (
 
-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
 
Alternative wäre auch popen (3)

Alex
 
Stimmt es jetzt?

NSData *theReadData = [theFileHandle readDataToEndOfFile];
NSString *thestring = [[[NSString alloc] initWithData:theReadData encoding:NSUTF8StringEncoding] autorelease];
[thetext setStringValue:thestring];
 
:-)

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
 
Stimmt, wird der denn nicht automatisch über die Pipe gesendet? Der Absender übergibt ja schließlich seinerzeit eine \0
 
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
 
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.
 
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?
 
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
 
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.