一种选择是使用 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
不过,这两种方法都相当慢(在我的 Air 上大约需要 0.05-0.2 秒)。有没有更快或更少黑客攻击的选项?
答案1
如何使用 PlistBuddy (8) 直接从应用程序的 Info.plist 文件中读取包标识符:
/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/Safari.app/Contents/Info.plist
答案2
mdls -name kMDItemCFBundleIdentifier -r SomeApp.app
答案3
使用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 的答案那么快,但是已经足够快了。
答案4
如果启用了显示所有文件扩展名,则 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'