Одним из вариантов будет использование AppleScript:
$ osascript -e 'id of app "Finder"'
com.apple.finder
Вы также можете сделать что-то вроде этого:
$ bundle=$(mdfind -onlyin / kMDItemKind==Application | grep -i "/Finder.app$" | head -1)
$ defaults read "$bundle/Contents/Info" CFBundleIdentifier
com.apple.finder
Оба они довольно медленные (около 0,05-0,2 с в моем эфире), хотя. Есть ли более быстрые или менее хакерские варианты?
defaults read
похоже на правильный способ сделать это (или запросить LaunchServices через Obj-C) - почему вы считаете 0,1 с медленными?osascript
решение. Сколько раз в секунду вам нужно запустить это хотя?Ответы:
Как насчет чтения идентификатора пакета непосредственно из файла Info.plist приложения с помощью PlistBuddy (8):
источник
mdls -name kMDItemCFBundleIdentifier -r SomeApp.app
источник
использование
lsappinfo
Чтобы получить только значение пакета, добавьте
| cut -d '"' -f4
к этой командеВам не нужно обрабатывать свой код вместе с путем к этому приложению, даже путь меняется.
Пока приложение запущено, вы получаете значение.
Хотя это и не так быстро, как ответ @ Surry, но достаточно быстро.
источник
lsappinfo
lsappinfo
работает только на работающих в данный момент приложениях.Значения
kMDItemKind
зависят от текущей локализации.Как насчет этого?
источник
Если отображение всех расширений имени файла включено, kMDItemDisplayName содержит .app для некоторых приложений, но не для других. Это также избежать имена , которые содержат
'
,"
или\
:a="Consultant's Canary"; a="${a//\'/\'}.app"; a=${a//"/\\"}; a=${a//\\/\\\\}; mdls -name kMDItemCFBundleIdentifier -raw "$(mdfind 'kMDItemContentType==com.apple.application-bundle&&kMDItemFSName=="'"$a"'"' | head -n1)"
Другой вариант:
a=Finder; mdls -name kMDItemCFBundleIdentifier -raw "$(mdfind kMDItemContentType==com.apple.application-bundle | sed -E $'s|(.*/)(.*)|\\1\t\\2|' | grep -F $'\t'"$a".app -m1 | tr -d '\t')"
Отдельная команда osascript также может быть быстрее:
источник