Uzyskiwanie identyfikatora pakietu aplikacji OS X w skrypcie powłoki

54

Jedną z opcji byłoby użycie AppleScript:

$ osascript -e 'id of app "Finder"'
com.apple.finder

Możesz także zrobić coś takiego:

$ bundle=$(mdfind -onlyin / kMDItemKind==Application | grep -i "/Finder.app$" | head -1)
$ defaults read "$bundle/Contents/Info" CFBundleIdentifier
com.apple.finder

Oba są jednak dość wolne (około 0,05-0,2 s na moim Air). Czy są jakieś szybsze lub mniej hackerskie opcje?

Lri
źródło
1
Używanie defaults readwydaje się właściwym sposobem na zrobienie tego (lub sprawdzanie usług LaunchServices za pośrednictwem Obj-C) - dlaczego uważasz 0.1s za wolne?
Asmus
Podoba mi się osascriptrozwiązanie. Ile razy na sekundę potrzebujesz to uruchomić?
arya

Odpowiedzi:

38

Co powiesz na odczytanie identyfikatora pakietu bezpośrednio z pliku Info.plist aplikacji bezpośrednio za pomocą PlistBuddy (8):

/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/Safari.app/Contents/Info.plist
surryhill
źródło
19

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app

Sean
źródło
8

Posługiwać się lsappinfo

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

Aby uzyskać tylko wartość pakietu, dodaj | cut -d '"' -f4do tego polecenia

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

Nie musisz obsługiwać kodu ze ścieżką tej aplikacji, nawet ścieżka się zmienia.

Dopóki aplikacja jest uruchamiana, masz wartość.

Chociaż nie jest tak szybki jak odpowiedź @ surry, ale jest wystarczająco szybki.

użytkownik1641838
źródło
Nie jestem downvoter, ale nie działa to dla mnie niezawodnie (podczas gdy inne metody działają). Działa z niektórymi aplikacjami, ale nie ze wszystkimi.
user137369,
@ user137369 Czy możesz mi powiedzieć, co to za aplikacja? BTW, aplikacja musi zostać uruchomionalsappinfo
użytkownik1641838
4
lsappinfodziała tylko na aktualnie uruchomionych aplikacjach.
mh.
1

Wartości kMDItemKindzależą od bieżącej lokalizacji.

Co powiesz na to?

mdls -name kMDItemCFBundleIdentifier \
     -raw "$(mdfind "(kMDItemContentTypeTree=com.apple.application) && (kMDItemDisplayName == 'photoshop*'cdw)" | head -1)"
elmimmo
źródło
0

Jeśli wyświetlanie wszystkich rozszerzeń nazw plików jest włączone, kMDItemDisplayName zawiera .app dla niektórych aplikacji, ale nie dla innych. Pozwoliłoby to również uniknąć nazwy, które zawierają ', "lub \:

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)"

Inna opcja:

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')"

Pojedyncze polecenie osascript może być także szybsze:

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
źródło