Как уже говорилось в комментариях, ваш сценарий предполагает, что AppleScript вернет список процессов, упорядоченных приложением, которое в последний раз имело фокус, но это не так.
Однако выможно получить список имен приложений в этом порядке, используя команду оболочки lsappinfo metainfo
.Передача этого через несколько дополнительных команд для выделения интересующей информации и очистки текста:
lsappinfo metainfo \
| grep bringForwardOrder \
| grep -E -o '"[^"]+"' \
| tr -d "\""
создает хороший, читаемый, упорядоченный список приложений, где каждый элемент в последнем был последним активным в последнее время.ниже приведенного ниже:
Google Chrome
Script Editor
Atom
Messages
WhatsApp
Finder
Safari
Script Debugger
WebTorrent
При проверке этого, когда я переключаюсь на Редактор сценариев и затем снова запускаю команду оболочки, возвращается список:
Script Editor
Google Chrome
Atom
Messages
WhatsApp
Finder
Safari
Script Debugger
WebTorrent
Поскольку вы заинтересованы только в различении этого порядка между двумя конкретными приложениями, а именно Safari и Google Chrome , команду оболочки можно несколько упростить до:
lsappinfo metainfo | grep -E -o 'Safari|Google Chrome' | head -1
, который будет возвращать одно имя, которое является браузером, который в данный момент либо активен, либо совсем недавно имел фокус;или пустая строка, если, скажем, не запущен ни один браузер.
Включение этого в ваш AppleScript и очистка сценария до некоторой степени:
property nil : ""
set [currentTabTitle, currentTabUrl] to [nil, nil]
set cmd to "lsappinfo metainfo | grep -E -o 'Safari|Google Chrome' | head -1"
set frontmostBrowser to do shell script cmd
if the frontmostBrowser = "" then return nil
if the frontmostBrowser = "Google Chrome" then
tell application "Google Chrome" to tell ¬
(a reference to the front window) to tell ¬
(a reference to its active tab)
if not (it exists) then return nil
set currentTabTitle to its title
set currentTabUrl to its URL
end tell
else if the frontmostBrowser = "Safari" then
tell application "Safari" to tell ¬
(a reference to the front document)
if not (it exists) then return nil
set currentTabTitle to its name
set currentTabUrl to its URL
end tell
end if
return "[" & currentTabTitle & "](" & currentTabUrl & ")"
Однако я бы предложил на самом деле составить сценарийкак сценарий оболочки.Я полагаю, что сценарий оболочки будет быстрее, чем AppleScript, потому что AppleScript потребует больше времени для запуска процесса оболочки и запуска сценария оболочки, чем оболочка для компиляции и запуска AppleScript (в данном случае - хотя, как правило, osascript
обычно медленнее, чем собственный процесс AppleScript).Другое преимущество заключается в том, что с помощью подстановки переменных оболочки мы можем сделать результирующий сценарий намного более компактным, сведя два блока кода AppleScript браузера в единый текстовый скрипт двойного назначения, который osascript
скомпилирует после того, как переменнаябыли сделаны замены (таким образом, избегая малярии времени выполнения / компиляции, о которой я упоминал в комментариях).
Сценарий оболочки (bash) выглядит следующим образом:
browser=$(lsappinfo metainfo | grep -E -o 'Safari|Google Chrome' | head -1)
[[ "$browser" = "Safari" ]] && syntax="current" || syntax="active"
script="tell app \"$browser\" to tell ¬
(a reference to the front window) to tell ¬
(a reference to its $syntax tab)
if not (it exists) then return \"\"
\"[\" & its name & \"](\" & its URL & \")\"
end tell"
[[ -n "$browser" ]] && osascript <<< "$script" || echo ""