Я обнаружил очень странную ошибку с Services.
Чтобы увидеть это поведение, сделайте следующее:
Убедитесь, что Safari находится в доке.
Откройте Автоматизатор. Создайте новую службу.
Настройте службу на получение «без ввода» в «любом приложении».
Вставьте действие «Запустить AppleScript».
Вставьте следующее в действие:
on run {input, parameters}
delay 5
display dialog "Hello"
tell application "Safari" to activate
return input
end run
Сохраните службу.
Закройте службу.
Повторно откройте Службу.
Automator должен представить вам диалоговое окно с вопросом: «Вы хотите установить службу «ServiceName»?» Нажмите «Установить».
Когда появится диалоговое окно «Установка завершена», нажмите «Готово».
Теперь запустите службу. Для этого нажмите на заголовок текущего приложения в верхнем левом углу экрана (второй пункт в строке меню). Затем нажмите на название услуги.
Вы заметите, что Safari немедленно откроется (о чем свидетельствует черная точка под его логотипом в Dock). Safari откроется до 5-секундной задержки и до отображения диалогового окна «Привет».
Помещение activate
оператора в подпрограмму не решает проблему.
Кто-нибудь может подтвердить, что это баг? Я убежден, что это ошибка с функцией «Службы», потому что когда вы запускаете службу из Automator (нажав кнопку «воспроизведение» в правом верхнем углу окна Automator), код работает правильно.
Если это ошибка, есть ли у кого-нибудь обходной путь, чтобы приложение фактически не открывалось до запуска предыдущего кода?
Мой Macbook Pro работает под управлением OS X El Capitan, 10.11.6.
Ошибка может быть связана с другим странным поведением, которое я заметил:
Выйдите из Safari.app и Automator.app, если они запущены.
Откройте папку, в которой хранятся службы компьютера (/Users/Me/Library/Services/) в Finder.
Щелкните правой кнопкой мыши файл службы и откройте файл с помощью Automator.
Вы заметите, что открытие файла .workflow с помощью Automator активирует Safari. Этого не должно быть.
Единственный обходной путь, который я нашел после тестирования нескольких различных сценариев, — это обернуть команды Safari внутри do shell script
команды , например do shell script "osascript -e 'tell application \"Safari\" to activate'"
. Обратите внимание, что с помощью можно указать osascript
несколько −e
параметров для создания многострочного сценария.
Со страницы руководства для osascript
:
−e заявление
Введите одну строку сценария. Если указано -e , osascript не будет искать имя файла в списке аргументов. Можно указать несколько параметров -e для создания многострочного сценария. Поскольку в большинстве скриптов используются специальные символы для многих программ-оболочек (например, AppleScript использует одинарные и двойные кавычки, «(», «)» и «*»), оператор должен быть правильно заключен в кавычки и экранирован, чтобы получить его. мимо оболочки нетронутой.
Пример кода AppleScript :
tell application "Safari"
activate
make new document in front
set URL of front document to "http://apple.stackexchange.com/questions/271133/services-bug-that-prematurely-activates-an-application"
end tell
Пример приведенного выше кода AppleScript , написанного в виде do shell script
команды с использованием osascript
параметра -e
, если необходимо.
do shell script "osascript -e 'tell application \"Safari\"' -e 'activate' -e 'make new document in front' -e 'set URL of front document to \"http://apple.stackexchange.com/questions/271133/services-bug-that-prematurely-activates-an-application\"' -e 'end tell'"
Как вы можете видеть, каждая строка кода AppleScript из tell
оператора normal block представляет собой отдельную -e
опцию , и, как указано на странице руководства для osascript
этой -e
опции , экранирование с помощью обратной косой черты было сделано по мере необходимости для правильной компиляции кода перед запуском. .
Другими словами, это превращает обычный tell
оператор блока и включенные в него команды в однострочную do shell script
команду , чтобы обойти очевидную ошибку в сценарии использования, представленном в OP.
Обратите внимание, что вы должны иметь возможность сделать то же самое с другими приложениями, вызванными той же ошибкой, заменив соответствующее имя приложения (и команды ) по мере необходимости.
пользователь3439894
сфера рубика
пользователь3439894
do shell script
, напримерdo shell script "osascript -e 'tell application \"Safari\" to activate'"
. Обратите внимание, что с помощьюosascript
можно указать несколько параметров -e для создания многострочного сценария.сфера рубика
Шариковая ручкаБен
tell application "Whatever" to ...
активирует это приложение. Это, вероятно, основная причина.