2009-09-18 17 views
8

He visto este hilo sobre cómo ejecutar comandos de terminal desde una aplicación Cocoa. Pero quiero lanzar Terminal.app a un directorio específico.Abrir una ventana de terminal a una carpeta especificada desde una aplicación Cocoa

sé que el siguiente no funciona:

[[NSWorkspace sharedWorkspace] openFile:folderPath withApplication:@"Terminal"]; 

Terminal intenta abrir la carpeta en realidad como un archivo.

¿Es esto algo para lo que tengo que usar AppleScript?

¿Alguna idea?

Respuesta

14

Usted podría utilizar AppleScript de cacao como esto:

NSString *s = [NSString stringWithFormat: 
    @"tell application \"Terminal\" to do script \"cd %@\"", folderPath]; 

NSAppleScript *as = [[NSAppleScript alloc] initWithSource: s]; 
[as executeAndReturnError:nil]; 

guión AppleScript fue tomada desde cobbal. ¡Gracias amigo!

+0

perfecto, gracias! –

+1

Aunque tal vez sea excesivo para este uso, Scripting Bridge (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html) es una buena solución para comunicarse con aplicaciones externas a través de AppleScript desde aplicaciones Objective-C. –

+0

tenga cuidado de las carpetas con comillas o espacios en ellas, aunque – cobbal

2

No estoy seguro si hay una manera de hacerlo en el cacao llano, pero en applescript Es bastante trivial

tell application "Terminal" to do script "cd ~/Desktop" 
+0

gracias, tú y woofy lo resolvieron! –

0

Realmente no sé AppleScript, pero apuesto a que podría utilizar para esto.

Si el directorio del terminal es el mismo cada vez, puede simplemente hacer un archivo ejecutable .sh con un comando cd y hacer que el argumento openFile.

0

Las respuestas existentes que sugieren utilizar el comando cd son geniales. Además, recomiendo consultar la fuente de la aplicación cdto para obtener un excelente ejemplo. Cdto es una mini aplicación rápida que abre una ventana de Terminal.app cd'd a la ventana del buscador más cercano. Esta aplicación está diseñada (incluido su icono) para colocarse en la barra de herramientas de la ventana del buscador.

0

Se puede utilizar el (ahora obsoleto) API AppleEvent carbono para enviar un evento "Do escritura" a 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; 
} 

forma here Tomada. Tenga en cuenta que Terminal.app se debe iniciar con -[NSWorkspace launchApplication:] si no se está ejecutando. Si se desea, se puede poner en primer plano con - [NSApplication activateWithOptions:]

Como sugerido por un comentario, esto puede ser fácilmente portado a la más moderna Scripting Bridge API.

Cuestiones relacionadas