web-dev-qa-db-ja.com

Automatorを使用してシェルスクリプトを開きます。ターミナルの出力を参照してください

Mac OS X 10.8 Mountain Lionで実行しているので、ちょっとした問題があります。

スクリプトがあります(WebKitのrun-safari)Safariを開発モードで起動します(いくつかの環境変数を設定してからArch -x86_64 /Applications/Safari/Contents/MacOS/SafariForWebKitDevelopment)。

このスクリプトを次の方法で改善したいと思います。

  • ダブルクリックできる、かわいらしいアイコンのショートカットを作りたい
  • 実行時にSafariをフォアグラウンドに移動させたい(現在コマンドを実行すると、ターミナルがフォアグラウンドに、Safariがバックグラウンドになります)
  • ターミナルウィンドウでSafariForWebKitDevelopmentコマンドからstdoutを表示できるようにしたい
  • 可能であれば、Safariが閉じたときにターミナルウィンドウを閉じたいと思います。

Automating、AppleScript、bashスクリプトを組み合わせることで、これらの3つのうち2つを取得できましたが、3つすべてではありません。誰かがここに何かポインタを持っていますか?

3
int3h

Slhckが提案したように、このタスクを実行するスタンドアロンのAppleScriptを作成し、それをAppleScriptエディターユーティリティに.appとして保存しました。それはまさに私が望むことをします。

以下で、スクリプトを見つけます。 SafariForWebKitDevelopmentが実行されているかどうかを確認し、必要に応じてスクリプトを実行して起動するようターミナルに指示します。 (これにより、新しいウィンドウが自動的に作成されます。デフォルトのターミナルの新しいウィンドウ設定を設定して、プロセスの終了時にウィンドウを閉じます。)次に、そのプロセスをトップウィンドウに設定します。

私は、SafariForWebKitDevelopmentと同時に実行されている通常のSafariのケースを処理する方法を見つけようと大胆に追跡し、最終的に、アプリケーションではなくプロセスを操作して、コードに表示されるソリューションに到達しました。

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
3
int3h