从Cocoa应用程序打开指向指定文件夹的终端窗口

时间:2009-09-18 20:57:49

标签: objective-c cocoa terminal

我看过这个关于如何在Cocoa应用程序中执行终端命令的线程。但我想实际将Terminal.app启动到指定的目录。

我知道以下内容不起作用:

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

终端尝试将文件夹实际打开为文件。

这是我必须使用AppleScript吗?

有什么想法吗?

5 个答案:

答案 0 :(得分:14)

您可以使用Cocoa中的AppleScript:

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

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

AppleScript脚本取自cobbal。谢谢你的队友!

答案 1 :(得分:2)

不确定是否有办法在普通可可中做到这一点,但在AppleScript中它是相当微不足道的

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

答案 2 :(得分:0)

我真的不懂AppleScript,但我打赌你可以用它来做这件事。

如果终端目录每次都相同,你可以在其中创建一个带有cd命令的可执行.sh文件,并将其作为openFile参数。

答案 3 :(得分:0)

建议使用cd命令的现有答案非常棒。此外,我建议您查看应用cdto的来源,以获得一个很好的例子。 Cdto是一个快速的迷你应用程序,它打开一个Terminal.app窗口cd'd到最前面的查找器窗口。设计此应用程序(包括它的图标)放置在取景器窗口的工具栏中。

答案 4 :(得分:0)

您可以使用(现已过时的)AppleEvent Carbon API发送" 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;
}

采取here形式。 请注意,如果未运行,则必须使用-[NSWorkspace launchApplication:]启动Terminal.app。 如果需要,可以使用- [NSApplication activateWithOptions:]

将其放在前台

根据评论的建议,这可以轻松移植到更现代的Scripting Bridge API