Отримання ідентифікатора пакета програми 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 секунди в моєму ефірі), хоча. Чи є якісь швидші чи менш хиткі варіанти?


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


8

Використовуйте lsappinfo

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

Щоб отримати лише значення bundleid, додайте | cut -d '"' -f4до цієї команди

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

Вам не доведеться обробляти свій код шляхом шляху цієї програми, навіть змінюється шлях.

Поки програма запущена, ви отримали значення.

Хоча це не так швидко, як відповідь @ surry, але це досить швидко.


Я не прихильник, але це не працює надійно для мене (в той час, як це роблять інші методи). Він працює з деякими програмами, але не з усіма.
користувач137369

@ user137369 Скажіть, будь ласка, що це за додаток? BTW, додаток потрібно запустити для використанняlsappinfo
user1641838

4
lsappinfoпрацює лише на поточно запущених додатках.
мч.

1

Значення kMDItemKindзалежать від поточної локалізації.

Як щодо цього?

mdls -name kMDItemCFBundleIdentifier \
     -raw "$(mdfind "(kMDItemContentTypeTree=com.apple.application) && (kMDItemDisplayName == 'photoshop*'cdw)" | head -1)"

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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.