3

У меня есть небольшая забавная проблема, работающая на Mac OS X 10.8 Mountain Lion.

У меня есть скрипт (run-safari WebKit), который запускает Safari в режиме разработки (он устанавливает некоторые переменные среды, а затем запускает arch -x86_64 /Applications/Safari/Contents/MacOS/SafariForWebKitDevelopment).

Я хочу улучшить этот скрипт следующими способами:

  • Я хочу сделать ярлык с двойным кликом по иконке
  • Я хочу, чтобы он вывел Safari на передний план при запуске (в настоящий момент запущенная команда оставляет Terminal на переднем плане, а Safari на заднем плане)
  • Я хочу видеть стандартный вывод из команды SafariForWebKitDevelopment в окне терминала
  • Если возможно, я бы хотел, чтобы окно терминала закрывалось при закрытии Safari.

Я смог получить любые два из трех, комбинируя Automating, AppleScript и сценарии bash, но не все три. У кого-нибудь есть здесь указатели?

1 ответ1

3

По предложению slhck, я создал автономный AppleScript, который выполняет эту задачу, а затем сохранил его в утилите редактора AppleScript как .app. Это именно то, что я хочу.

Ниже найдите скрипт. Он проверяет, запущен ли 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .