Vous pouvez utiliser le (désormais obsolète) AppleEvent API Carbon pour envoyer un événement "Do Script" à Terminal.app:
OSStatus doTerminalScript (NSString* script) {
AppleEvent evt;
OSStatus err;
// Build event
err = AEBuildAppleEvent(kAECoreSuite, kAEDoScript,
typeApplicationBundleID, "com.apple.terminal", 18L,
kAutoGenerateReturnID, kAnyTransactionID, &evt, NULL,
"'----':utf8(@)", strlen([script UTF8String]), [script UTF8String]);
if (err) return err;
AppleEvent res;
// Send event
err = AESendMessage(&evt, &res, kAEWaitReply, kAEDefaultTimeout);
AEDisposeDesc(&evt);
if (err) return err;
// Check for any errors from Terminal.app
AEDesc desc;
err = AEGetParamDesc(&res, keyErrorNumber, typeSInt32, &desc);
AEDisposeDesc(&res);
if (!err) {
AEGetDescData(&desc, &err, sizeof(err));
AEDisposeDesc(&desc);
} else if (err == errAEDescNotFound)
err = noErr;
return err;
}
forme prise here. Notez que Terminal.app doit être lancé avec -[NSWorkspace launchApplication:]
s'il n'est pas en cours d'exécution. Si vous le souhaitez, il peut être mis au premier plan avec - [NSApplication activateWithOptions:]
Comme le suggère un commentaire, cela peut être facilement porté à la Scripting Bridge API plus moderne.
parfait, merci! –
Bien que peut-être exagéré pour cette utilisation, le Scripting Bridge (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html) est une bonne solution pour communiquer avec des applications externes via AppleScript dans les applications Objective-C. –
faites attention aux dossiers avec des guillemets ou des espaces en eux si – cobbal