Terminal command uitvoeren in Cocoa programma

Hallo,

ik was even benieuwd of het mogelijk is om een terminal command uit te voeren als je op een knop drukt in een cocoa programma.

Alvast bedankt!

Groet,
Jeroen

je kan toch in cocoa gewoon C commando's uitvoeren? Indien dit kan kan je gewoon een terminal commando uitvoeren in cocoa met commando:

[code:1:f00cd7d50f]system("commando’);[/code:1:f00cd7d50f]

houdt er wel rekening mee dat je return een integer is van het programma. om de output (die je ook in terminal venster ziet) te krijgen moet je de output pipen naar een bestand en deze weer uitlezen. Voorbeeld wanneer je xxd (hex dump) uitvoert op een bestand kan je deze returns krijgen

0 = succesvol uitgevoerd
-1 = actie wordt niet ondersteund

Wanneer er een 0 wordt gereturned kan je verder gaan omdat je dan weet dat het uitvoeren van je terminal commando goed is verlopen.

Ik weet niet of er in cocoa een ‘do shell script’ functie in is gebouwd omdat ik niet bekend ben met cocoa. dus als dat wel zo is zal het zeker een een betere oplossing zijn dan ik hier heb genoemd.

Voorbeeld om wakeonlan commando uit te voeren van cocoa prog.

[code:1:ce3624b7ec]NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/wakeonlan"];

NSArray *arguments;
NSString *ipadress = [[urlTextField stringValue] substringFromIndex:7];
arguments = [NSArray arrayWithObjects: @"-i", ipadress, [macAdressField stringValue],nil];
[task setArguments: arguments];

&#91;task launch&#93;;[/code:1:ce3624b7ec]</p>

[quote:0dbad7c0a3="dj bazzie wazzie"]je kan toch in cocoa gewoon C commando's uitvoeren? Indien dit kan kan je gewoon een terminal commando uitvoeren in cocoa met commando:

[code:1:0dbad7c0a3]system("commando’);[/code:1:0dbad7c0a3]

houdt er wel rekening mee dat je return een integer is van het programma. om de output (die je ook in terminal venster ziet) te krijgen moet je de output pipen naar een bestand en deze weer uitlezen. Voorbeeld wanneer je xxd (hex dump) uitvoert op een bestand kan je deze returns krijgen

0 = succesvol uitgevoerd
-1 = actie wordt niet ondersteund

Wanneer er een 0 wordt gereturned kan je verder gaan omdat je dan weet dat het uitvoeren van je terminal commando goed is verlopen.

Ik weet niet of er in cocoa een ‘do shell script’ functie in is gebouwd omdat ik niet bekend ben met cocoa. dus als dat wel zo is zal het zeker een een betere oplossing zijn dan ik hier heb genoemd.[/quote:0dbad7c0a3]

Er is in cocoa obj-c geen do shell script nee, wel een NSTask functie zoals phalkone hierboven beschrijft.

In C zou ik overigens eerder popen() gebruiken voor een terminal commando dan system(). Met popen kun je de terminal output makkelijker pipen naar een string.

@PascalW: dank je wel dat wist ik niet. Ik heb zelf namelijk alleen nog maar system(); hoeven te gebruiken om 'ditto' uit te voeren voor een backup tool. Maar heb er zeker iets aan in de toekomst wanneer ik dus wil gaan pipen in mijn C-tools.

bedankt!

Oke bedankt allemaal! Dit moet gaan lukken.

http://imlocation.wordpress.com/2007/06/21/calling-the-command-line-from-cocoa/

Dat is wat je wilt. Eveneens een NSTask implementatie, maar tevens NSPipe eraan toe gevoegd zodat je de output kan lezen.

Nog een vraagje, is dit ook mogelijk in een AppleScript oplossing? Ik heb deze code in een AppleScript document geplaatst en opgeslagen als .scpt: do shell script "killall Dock"

Nu sleep ik deze in Xcode (versie 3 in Leopard), en maak nu een knop met de naam “Restart”, en Enable de applescript met Action clicked. Maar nu ik het programma open, en op de knop druk, gebeurd er niets.

Iemand weet of ik het wel goed doe?

[quote:75db973b6b="Studio Jeroen"]Nog een vraagje, is dit ook mogelijk in een AppleScript oplossing? Ik heb deze code in een AppleScript document geplaatst en opgeslagen als .scpt: do shell script "killall Dock"

Nu sleep ik deze in Xcode (versie 3 in Leopard), en maak nu een knop met de naam “Restart”, en Enable de applescript met Action clicked. Maar nu ik het programma open, en op de knop druk, gebeurd er niets.

Iemand weet of ik het wel goed doe?[/quote:75db973b6b]

Waarom zou je dat doen? Dan ga je in cocoa, via applescript met je subsytem communiceren. Ik zou dit via zo min mogelijk omwegen doen.

Mocht je het toch willen doen, er bestaat een mogelijkheid om een applescript script vanuit je application bundle uit te voeren, of zelfs applescript direct vanuit cocoa/obj-c uit te voeren. Zo bijvoorbeeld:

[code:1:75db973b6b]
NSDictionary *error;
NSAppleScript *script = [[NSAppleScript alloc] initWithSource: @"tell app "safari" to activate"];
NSAppleEventDescriptor *result = [script executeAndReturnError: &error];
[script release];
[/code:1:75db973b6b]

[quote:a3c61c4a80="PascalW"][quote:a3c61c4a80="Studio Jeroen"]Nog een vraagje, is dit ook mogelijk in een AppleScript oplossing? Ik heb deze code in een AppleScript document geplaatst en opgeslagen als .scpt: do shell script "killall Dock"

Nu sleep ik deze in Xcode (versie 3 in Leopard), en maak nu een knop met de naam “Restart”, en Enable de applescript met Action clicked. Maar nu ik het programma open, en op de knop druk, gebeurd er niets.

Iemand weet of ik het wel goed doe?[/quote:a3c61c4a80]

Waarom zou je dat doen? Dan ga je in cocoa, via applescript met je subsytem communiceren. Ik zou dit via zo min mogelijk omwegen doen.

Mocht je het toch willen doen, er bestaat een mogelijkheid om een applescript script vanuit je application bundle uit te voeren, of zelfs applescript direct vanuit cocoa/obj-c uit te voeren. Zo bijvoorbeeld:

[code:1:a3c61c4a80]
NSDictionary *error;
NSAppleScript *script = [[NSAppleScript alloc] initWithSource: @"tell app "safari" to activate"];
NSAppleEventDescriptor *result = [script executeAndReturnError: &error];
[script release];
[/code:1:a3c61c4a80][/quote:a3c61c4a80]

Het nadeel van NSAppleScript is dat het niet threadsave is en de mainthread geblocked wordt tijdens het uitvoeren.

Niet altijd een probleem maar indien wel dan kun je via NSTask het osascript commando gebruiken.

[code:1:a3c61c4a80]-(void) executeScript: (NSString*) scriptText
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSString *command = scriptText;
NSMutableArray *args = &#91;NSMutableArray arrayWithObjects&#58;@&quot;-e&quot;, command, nil&#93;;

NSTask *task = &#91;&#91;&#91;NSTask alloc&#93; init&#93; autorelease&#93;;
&#91;task setLaunchPath&#58;@&quot;/usr/bin/osascript&quot;&#93;;
&#91;task setArguments&#58;args&#93;;

&#91;task launch&#93;;
&#91;task waitUntilExit&#93;;

&#91;pool release&#93;;

}[/code:1:a3c61c4a80]

En zo roep je het aan:

[code:1:a3c61c4a80][self executeScript: [NSString stringWithFormat: @"tell application "EyeTV"nchannel_change channel number %dn end telln", channel]];[/code:1:a3c61c4a80]

Oke bedankt allemaal. Dit moet gaan lukken...

:slight_smile: