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

Lri*_*Lri 67 macos

一种选择是使用 AppleScript:

$ osascript -e 'id of app "Finder"'
com.apple.finder
Run Code Online (Sandbox Code Playgroud)

你也可以做这样的事情:

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

不过,这两者都相当慢(在我的 Air 上大约 0.05-0.2 秒)。有没有更快或更简单的选择?

小智 44

如何直接使用 PlistBuddy (8) 从应用程序的 Info.plist 文件中读取包标识符:

/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/Safari.app/Contents/Info.plist
Run Code Online (Sandbox Code Playgroud)


小智 32

mdls -name kMDItemCFBundleIdentifier -r SomeApp.app


小智 13

lsappinfo

CC@~ $ lsappinfo info -only bundleid Finder
"CFBundleIdentifier"="com.apple.finder"
Run Code Online (Sandbox Code Playgroud)

要仅获取 bundleid 值,请添加| cut -d '"' -f4到该命令

CC@~ $ lsappinfo info -only bundleid Finder | cut -d '"' -f4
com.apple.finder
Run Code Online (Sandbox Code Playgroud)

您不必使用该应用程序的路径来处理您的代码,即使路径发生变化。

只要应用程序启动,您就会获得一个值。

虽然它没有@surry 的回答那么快,但它已经足够快了。

  • `lsappinfo` 仅适用于当前运行的应用程序。 (5认同)

Lri*_*Lri 0

如果启用显示所有文件扩展名,则 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'
Run Code Online (Sandbox Code Playgroud)