我遇到了一个有趣的小问题,在 Mac OS X 10.8 Mountain Lion 上运行。
我有一个脚本(WebKit的run-safari
),它以开发模式启动Safari(它设置一些环境变量然后运行arch -x86_64 /Applications/Safari/Contents/MacOS/SafariForWebKitDevelopment
)。
我想通过以下方式改进这个脚本:
- 我想创建一个可双击、带有漂亮图标的快捷方式
- 我希望它在运行时将 Safari 带到前台(当前运行的命令使终端留在前台,而 Safari 留在后台)
- 我希望能够在终端窗口中看到 SafariForWebKitDevelopment 命令的标准输出
- 如果可能的话,我希望当 Safari 关闭时终端窗口也关闭。
我可以通过结合自动化、AppleScript 和 bash 脚本来获得其中的任意两个,但不能同时获得三个。有人能指点一下吗?
答案1
根据 slhck 的建议,我创建了一个独立的 AppleScript 来完成此任务,然后将其作为 .app 保存在 AppleScript 编辑器实用程序中。它完全符合我的要求。
下面,找到脚本。它会检查 SafariForWebKitDevelopment 是否正在运行,并告诉终端运行脚本以在需要时启动它。(这会自动创建一个新窗口,我将默认的终端新窗口设置为在其进程退出时关闭窗口。)然后它将该进程设置为顶部窗口。
我费尽心机尝试弄清楚如何处理常规 Safari 与 SafariForWebKitDevelopment 同时运行的情况,最后找到了您在代码中看到的解决方案,即使用进程而不是应用程序。
tell application "System Events"
-- Only launch development Safari if it isn't already running
if not (exists process "SafariForWebKitDevelopment") then
tell application "Terminal"
do script "run-safari; exit"
activate
end tell
end if
-- Max number of iterations of checking for process before
-- we give up and exit the script (guards against errors in
-- launching SafariForWebKitDevelopment, where the process
-- would never exist, and this would be an infinite loop)
set num_checks to 100
-- Wait until dev Safari has launched
repeat until (exists process "SafariForWebKitDevelopment")
delay 0.1
set num_checks to num_checks - 1
if num_checks < 0 then
return
end if
end repeat
-- Set dev Safari to have focus
-- 'tell application "Safari" to activate' doesn't work because AppleScript
-- has no way of discerning between multiple processes from the same .app
-- bundle, so we can't be sure if we're talking to
-- SafariForWebKitDevelopment, or an already-running normal Safari
set frontmost of (process "SafariForWebKitDevelopment") to true
end tell