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?
defaults read
wydaje 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?osascript
rozwiązanie. Ile razy na sekundę potrzebujesz to uruchomić?Odpowiedzi:
Co powiesz na odczytanie identyfikatora pakietu bezpośrednio z pliku Info.plist aplikacji bezpośrednio za pomocą PlistBuddy (8):
źródło
mdls -name kMDItemCFBundleIdentifier -r SomeApp.app
źródło
Posługiwać się
lsappinfo
Aby uzyskać tylko wartość pakietu, dodaj
| cut -d '"' -f4
do tego poleceniaNie 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.
źródło
lsappinfo
lsappinfo
działa tylko na aktualnie uruchomionych aplikacjach.Wartości
kMDItemKind
zależą od bieżącej lokalizacji.Co powiesz na to?
źródło
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:
źródło