Mac OS X:从命令行启动(非捆绑)GUI应用程序时将其置于前台

10

当在OS X终端中启动GUI进程时,窗口会出现在后台,您必须使用command-tab给它焦点。

有没有办法让终端在启动GUI后自动将其聚焦? 例如(假设已安装gitk):

% gitk

应该启动GUI,然后切换到它。

注意:由于多种原因,像这个答案建议的使用open并不是一个通用解决方案。

更新:为了更好地解释为什么open方法不令人满意,这里有一个示例bash会话(带有诙谐的评论)。

% cd /my_repo
% gitk

等待 GUI 出现...应该很快就会出现了...哦,等等——它已经打开了。我没有注意到是因为它在我的终端窗口后面打开了一个窗口。我想知道我会坐在这里等多久....

% open gitk
The file /my_repo/gitk does not exist.

啊,当然。

% which gitk
/usr/bin/gitk
% open /usr/bin/gitk

我的天啊,它打开了一个新的终端窗口来运行gitk,并且它在我的主目录下运行了它,而不是在/my_repo下,所以gitk抱怨当前目录实际上不是一个仓库...


如果你能解释一下为什么需要从命令行同步调用窗口化应用程序(而不是使用“打开”异步地打开它),那可能会有所帮助。 - Chris Page
并非所有应用程序都可以通过 open 命令打开(例如 gitk)。此外,那些可以通过该方式打开的应用程序将在单独的终端中打开,这可能会不太方便。 - Stuart Berg
并非所有应用程序都可以通过“打开”打开。为什么呢?我想不出任何理由--按定义,正常/窗口化的应用程序应该是您可以从Finder或Dock打开的东西。“将通过单独的终端打开”。我不明白你所说的“单独的终端”是什么意思。你是说,即使你打开了一个终端,你也不能从那个终端使用open ...吗?如果是这样,为什么? - Chris Page
抱歉表述不够清晰。我刚刚更新了问题,希望能解释为什么“open”并不完全符合要求... - Stuart Berg
gitk正在做一些奇怪的事情,部分表现得像GUI应用程序,部分则像命令行工具(注意其当前工作目录)。我认为理想情况下它应该负责将自己带到前台。 - JWWalker
谢谢,你们俩我明白了。这很奇怪,它应该根据命令行参数自动激活。如果您已经提供足够的信息执行完整操作,它应该保持在后台,但如果您打开它以进行交互,则应该激活。 (一般来说,应用程序不应在用户未请求时激活自己。) - Chris Page
3个回答

4

你需要同步调用它吗?如果不需要,你可以使用&以异步方式启动它,然后使用osascript -e 'tell application "gitk" to activate'来激活它。


这个在macOS Big Sur之前是有效的,但现在似乎被破坏了。如果我仍然从终端单独运行osascript命令,它可以工作。但是当我将其作为函数的一部分来调用实际工具并使用&进行激活后延迟0.5,它不再起作用。我错过了什么吗? - shikhanshu

2
如果您只是在处理gitk工具,您可以编辑gitk文件来实现此目的,我在苹果交换站点上发布了一个答案:https://apple.stackexchange.com/a/74917/35956 您可以使用终端命令查找gitk文件。
which gitk

在我的gitk文件中,我发现在顶部附近(第3行)有一行看起来像以下内容的代码:
exec wish "$0" -- "$@"

我把它改成了这样。
exec wish "$0" -- "$@" & exec osascript -e "tell application \"Wish\" to activate"

当我从命令行执行 gitk 时,gitk 窗口会在前景运行,这也导致它异步执行。

1
你可以将@chris页面的答案封装在一个bash函数中,并将其放入你的.bashrc文件中。
function gitk() {
  command gitk "$@"&
  command osascript -e "delay .5" -e "tell application \"wish\" to activate"
}

应该有一种方法可以通过循环和设置超时来消除延迟,同时查找“wish”。

注意:“Wish”是我在Mac上使用gitk时出现的窗口标题。


今天最新的 macOS 系统,这个对你还有效吗? - shikhanshu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接