Как получить Bundle ID (или путь к списку) приложения только из PID? - PullRequest
0 голосов
/ 12 января 2012

По аналогии с "Как найти идентификатор пакета из известного PID?" и "Как прочитать информацию о списке (идентификатор пакета) из сценария оболочки , но отличается .. оба они связаны с расширением переменных сборки Xcode и т. д.

Мой вопрос заключается в том, как в оболочке BASH, где их единственным известным значением является «PID процесса», как можно получить этот процесс » PATH или уникальный« Bundle ID ». 1010 *

Я уверен, что есть паршивое регулярное выражение для разбора ps, но я надеюсь на что-то более чистое и более переносимое. Комментарии в этих ранее упомянутых постах включали

BUNDLE_ID=$(/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "${BUILD_ROOT}/${INFOPLIST_PATH}")

Однако я не думаю, что plistbuddy установлен на каждом Mac, и что более важно, мой вопрос находится в теоретическом сценарии, а НЕ в фазе сборки Xcode.

Я пробовал plutil, plistkit и plistdump, и, похоже, никто из них не справился с задачей ..

Причина, по которой я пытаюсь добиться этого, заключается в том, чтобы иметь возможность выполнять defaults read / write функций без жесткого кодирования BundleID родительского процесса. Я знаю, как передать эту информацию в качестве аргумента сценарию ... но я хочу иметь возможность проверять сомнения ... в сценарии.

1 Ответ

1 голос
/ 02 мая 2012

Нет необходимости в отвратительном регулярном выражении для анализа вывода ps - утилита ps уже делает то, что вы о ней просите. Называя его с (по-видимому, несколько загадочным) следующими опциями

ps [-ww] -o comm= -p <pid>

вернет путь к исполняемому файлу, принадлежащему вашему PID (аргумент -ww необходим только при выводе на терминал, так как ps будет обрезать возвращаемый путь без него. В противном случае это не нужно).

Проблема с получением идентификатора пакета из-за того, что не все процессы отображаются на пакеты с Info.plist (который определяет идентификатор пакета) - в частности, исполняемые файлы * nix-типа не являются пакетами и, следовательно, не имеют идентификатора пакета. Кроме того, даже в случае комплектов приложений ps возвращает основной исполняемый файл приложения, а не путь к самому комплекту. Однако, поскольку путь к исполняемому файлу внутри пакета приложения стандартизирован (он находится в Path.app/Contents/MacOS), вы можете получить его с небольшим обходом каталога.

Предполагая, что вы сохранили вывод вызова ps выше в переменной execfile, это

[[ ${execfile%/*} =~ ^.+/Contents/MacOS$ ]] && defaults read "${execfile%/*/*}"/Info CFBundleIdentifier

будет извлекать идентификаторы пакета для вероятных путей, используя defaults для получения значения ключа CFBundleIdentifier файла Info.plist, который каждый пакет приложения содержит в своем корне.

...