我看过这个关于如何在Cocoa应用程序中执行终端命令的线程。但我想实际将Terminal.app启动到指定的目录。
我知道以下内容不起作用:
[[NSWorkspace sharedWorkspace] openFile:folderPath withApplication:@"Terminal"];
终端尝试将文件夹实际打开为文件。
这是我必须使用AppleScript吗?
有什么想法吗?
答案 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。