2009-09-18 8 views
8

Ho visto questo thread su come eseguire i comandi del terminale da un'app Cocoa. Ma in realtà voglio avviare Terminal.app in una directory specificata.Apre una finestra di terminale in una cartella specificata da un'app Cocoa

So che quanto segue non funziona:

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

Terminal tenta di aprire la cartella in realtà come un file.

È questo qualcosa che devo usare per AppleScript?

Qualche idea?

risposta

14

Si potrebbe usare AppleScript da Cocoa in questo modo:

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

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

script AppleScript è stata presa da cobbal. Grazie compagno!

+0

perfetto, grazie! –

+1

Anche se forse eccessivo per questo uso, lo Scripting Bridge (http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/Introduction/Introduction.html) è una buona soluzione per comunicare con app esterne tramite AppleScript dalle app Objective-C. –

+0

fai attenzione alle cartelle con le virgolette o spazi in esse anche se – cobbal

2

Non sono sicuro se c'è un modo per farlo in cacao amaro, ma in AppleScript è abbastanza banale

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

grazie, tu e woofy l'avete risolto! –

0

io non so davvero AppleScript, ma scommetto che si potrebbe usare per questo.

Se la directory di terminale è la stessa ogni volta, è sufficiente creare un file .sh eseguibile con un comando cd e renderlo l'argomento openFile.

0

Le risposte esistenti che suggeriscono l'utilizzo del comando cd sono eccezionali. Inoltre, ti consiglio di controllare la fonte per l'app cdto per un ottimo esempio. Cdto è una mini applicazione veloce che apre una finestra di Terminal.app cd'd in primo piano nella finestra di ricerca. Questa app è stata progettata (inclusa l'icona) per essere inserita nella barra degli strumenti della finestra di ricerca.

0

È possibile utilizzare la (ormai obsoleto) API AppleEvent carbonio per inviare un evento "Do Script" per 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 Taken. Nota che Terminal.app deve essere avviato con -[NSWorkspace launchApplication:] se non in esecuzione. Se lo si desidera, può essere messo in primo piano con - [NSApplication activateWithOptions:]

Come suggerito da un commento, questo può essere facilmente portato alla più moderna Scripting Bridge API.

Problemi correlati