Нет необходимости в отвратительном регулярном выражении для анализа вывода 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
, который каждый пакет приложения содержит в своем корне.