Получение идентификатора пакета приложения OS X в сценарии оболочки

54

Одним из вариантов будет использование 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 с в моем эфире), хотя. Есть ли более быстрые или менее хакерские варианты?

LRI
источник
1
Использование defaults readпохоже на правильный способ сделать это (или запросить LaunchServices через Obj-C) - почему вы считаете 0,1 с медленными?
Асмус
Мне нравится osascriptрешение. Сколько раз в секунду вам нужно запустить это хотя?
арйа

Ответы:

38

Как насчет чтения идентификатора пакета непосредственно из файла Info.plist приложения с помощью PlistBuddy (8):

/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/Safari.app/Contents/Info.plist
surryhill
источник
19

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app

Шон
источник
8

использование lsappinfo

CC@~ $ lsappinfo info -only bundleid Finder
"CFBundleIdentifier"="com.apple.finder"

Чтобы получить только значение пакета, добавьте | cut -d '"' -f4к этой команде

CC@~ $ lsappinfo info -only bundleid Finder | cut -d '"' -f4
com.apple.finder

Вам не нужно обрабатывать свой код вместе с путем к этому приложению, даже путь меняется.

Пока приложение запущено, вы получаете значение.

Хотя это и не так быстро, как ответ @ Surry, но достаточно быстро.

user1641838
источник
Я не downvoter, но это не работает надежно для меня (в то время как другие методы делают). Он работает с некоторыми приложениями, но не со всеми.
user137369
@ user137369 Не могли бы вы сказать мне, что это за приложение? Кстати, приложение должно быть запущено для использованияlsappinfo
user1641838
4
lsappinfoработает только на работающих в данный момент приложениях.
тк.
1

Значения kMDItemKindзависят от текущей локализации.

Как насчет этого?

mdls -name kMDItemCFBundleIdentifier \
     -raw "$(mdfind "(kMDItemContentTypeTree=com.apple.application) && (kMDItemDisplayName == 'photoshop*'cdw)" | head -1)"
elmimmo
источник
0

Если отображение всех расширений имени файла включено, 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 также может быть быстрее:

osascript -e 'on run args
set output to {}
repeat with a in args
set end of output to id of app a
end
set text item delimiters to linefeed
output as text
end' Finder 'AppleScript Editor'
LRI
источник