使用 Automator 打开 shell 脚本,在终端中查看输出

使用 Automator 打开 shell 脚本,在终端中查看输出

我遇到了一个有趣的小问题,在 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

相关内容