Getting the bundle identifier of an OS X application in a shell script
One option would be to use AppleScript:
$ osascript -e 'id of app "Finder"'
com.apple.finderYou could also do something like this:
$ bundle=$(mdfind -onlyin / kMDItemKind==Application | grep -i "/Finder.app$" | head -1)
$ defaults read "$bundle/Contents/Info" CFBundleIdentifier
com.apple.finderBoth of these are fairly slow (about 0.05-0.2s on my Air) though. Are there any faster or less hacky options?
25 Answers
How about reading the bundle identifier from the application's Info.plist file directly using PlistBuddy (8):
/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/ 3 mdls -name kMDItemCFBundleIdentifier -r SomeApp.app
Use lsappinfo
CC@~ $ lsappinfo info -only bundleid Finder
"CFBundleIdentifier"="com.apple.finder"To get only the bundleid value, add | cut -d '"' -f4 to that command
CC@~ $ lsappinfo info -only bundleid Finder | cut -d '"' -f4
com.apple.finderYou don't have to handle your code with the path of that application, even the path changes.
As long as the application is started, you got an value.
Though it is not as fast as @surry's answer, but it's fast enough.
4Values of kMDItemKind depend on the current localization.
How about this?
mdls -name kMDItemCFBundleIdentifier \ -raw "$(mdfind "(kMDItemContentTypeTree=com.apple.application) && (kMDItemDisplayName == 'photoshop*'cdw)" | head -1)" If showing all filename extensions is enabled, kMDItemDisplayName contains .app for some applications but not others. This would also escape names that contain ', ", or \:
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)"
Another option:
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')"
A single osascript command might also be faster:
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'