моя цель - использовать Automator для открытия приложения с аргументами
open ./MyApp.app -arguments
через запуск разделяемого Buddy.app с Myapp.app (Automator / рабочий процесс). оба приложения должны быть доступны всем пользователям, чтобы они сразу запускались.
кажется, что самый простой способ сделать это - запустить Buddy.app из той же папки, что и MyApp.app. тогда я могу переместить Buddy.app с MyApp.app куда угодно, и они все равно будут работать вместе
установить относительное расположение файлов в скрипте bash,
open "$(pwd)"/myapp.app -arguments
Единственная проблема заключается в том, что Automator использует домашний каталог вместо каталога приложения. т.е. pwd это домашний каталог, а не фактическое местоположение файла.
в Automator вывод из
echo $(pwd)
мой домашний каталог, / Пользователи / Пользователь
поэтому вопрос в том, как заставить Automator (Buddy.app) определить текущее местоположение папки и запустить MyApp.app?
/Applications
и защищен им . Вы можете проверить это, запустив , или . Так почему бы не просто жесткий код ?grep Automator /System/Library/Sandbox/rootless.conf
ls -ldAO@ /Applications/Automator.app
/Applications
~/foo
и приложения~/foo/MyApp.app
. Ваша цель состоит в том, чтобы рабочий процесс Automator действовал в качестве партнераMyApp.app
и находился в том же каталоге, что иMyApp.app
всегда. Вы хотите иметь возможность перемещатьсяMyApp.app
по своему усмотрению, например, в любую папку, которая вам нравится~/bar
- до тех пор, пока рабочий процесс собеседника проходит вместе с ним. Наконец, вы хотите иметь возможность запускать рабочий процесс приятеля из любого места, например из Finder, или использовать,open ~/bar/MyWorkflow.workflow
находясь внутри/tmp/meow
. Правильный?Ответы:
Пусть ваш рабочий процесс определит свой собственный путь (более надежный)
Это работает до тех пор, пока ваш рабочий процесс Automator находится в том же каталоге, что и
MyApp.app
; вы можете создавать копии рабочего процесса или приложения по своему усмотрению и повторно использовать их в любом месте; ничто не должно быть уникальным.меры
Вот шаги для автоматизации запуска
MyApp.app
:Откройте рабочий процесс в Automator.
Добавьте действие « Выполнить AppleScript» . Удалите весь код шаблона внутри и замените его следующими строками:
Сохраните рабочий процесс Automator в той же папке, что и
MyApp.app
.Запустите рабочий процесс Automator; оно должно запуститься
MyApp.app
.объяснение
Это означает: «Берегись, я скоро разделю строку; и я хочу, чтобы вы использовали этот
:
персонаж в качестве разделенных границ ».Это инструктирует рабочий процесс, чтобы выяснить путь к себе; Компоненты пути разделяются двоеточием (
:
), которое является остатком классической Mac OS .Это обрезает последнюю часть пути и добавляет
MyApp.app
к пути.Это соединяет путь обратно (снова с
:
разделителем).Наконец, эта последняя строка вызывает
MyApp.app
запуск.источник
Используйте идентификатор пакета целевого приложения (более гибкий)
Вы планируете держать делать только одну копию из
MyApp.app
на всю систему?Если да, то вы можете воспользоваться
MyApp.app
«s идентификатор пакета, и есть Launch Services выяснить все мельчайшие детали для вас.Это решение довольно гибкое; у него есть то преимущество, что вы можете разместить рабочий процесс Automator там, где вам нужно - он не обязательно должен находиться в том же месте, где он находится
MyApp.app
, или в каком-либо фиксированном месте относительно него.меры
Вот шаги, которые вы хотите предпринять:
Откройте Terminal.app и выполните следующую команду:
Предыдущий шаг должен был распечатать одну строку в результате. Обратите внимание, что говорит эта строка (например,
com.example.MyApp
).Откройте свой рабочий процесс в Automator.
Добавьте действие Run Shell Script с содержимым:
Сохраните рабочий процесс Automator в любой папке на ваше усмотрение - нет необходимости размещать его в фиксированном месте относительно
MyApp.app
.Запустите рабочий процесс Automator; оно должно запуститься
MyApp.app
.объяснение
Услуги запуска
Это решение использует часть macOS, называемую Launch Services, которая поддерживает общесистемную базу данных приложений и их свойств :
План
Интересующая нас информация - это идентификатор пакета или идентификатор пакета.
Разработчик приложения обычно присваивает каждому из своих приложений (надеюсь) глобально уникальный идентификатор пакета. Мы можем воспользоваться этой уникальностью тогда и только тогда, когда в нашей системе не будет более одного приложения с одинаковым идентификатором пакета и только одна копия этого приложения. Нет дубликатов.
Выяснить путь
Команда
это просто модный способ запустить поиск Spotlight в виде одноразового ярлыка, чтобы выяснить путь приложения на данный момент. Нам нужен путь только один раз, чтобы извлечь идентификатор пакета приложения.
Прожектор (надеюсь) вернется с чем-то вроде этого:
Извлечение CFBundleIdentifier
Перенос текущего пути приложения в следующую команду AppleScript:
это просто удобный способ ** извлечь
CFBundleIdentifier
** изMyApp.app
пакета.(Вы также можете вручную просмотреть идентификатор пакета, щелкнув правой кнопкой мыши приложение в Finder, выбрав « Показать содержимое пакета» , перейдя к
Contents
подпапке и открыв егоContents/Info.plist
в TextEdit, найдите ключ, который говорит,CFBundleIdentifier
и найдите егоString
значение на одну строку ниже. I думаю, что это утомительно, поэтому я всегда предпочитаю использовать AppleScript /mdfind
фрагмент кода.)Запуск приложения по идентификатору пакета
Наконец, давайте посмотрим на команду, которую вы фактически собираетесь использовать в рабочем процессе Automator:
Эта команда - просто технический способ сказать: «Эй, macOS, с тобой хорошие друзья
launchd
, верно? Вы можете запустить это приложение для меня? О, кстати, я никогда не удосужился найти полный путь к нему. Что я знаю, хотя это егоCFBundleIdentifier
, который естьcom.example.MyApp
; просто зайдите в Launch Services, и они определят путь ».источник