在 Shell 脚本中获取 OS X 应用程序的包标识符

在 Shell 脚本中获取 OS X 应用程序的包标识符

一种选择是使用 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'

相关内容