如何从shell脚本中读取plist信息(bundle id)

38

我希望编写一个脚本,可以从应用程序的 Info.plist 中读取 Bundle Identifier 或版本号等信息。Xcode 在其环境变量中似乎没有提供这些信息。有没有其他方法可以在 sh/bash 中获取它们?

5个回答

82

defaults 命令可以读写任何 plist 文件,只需给出不带 .plist 扩展名的路径即可:

$ defaults read /Applications/Preview.app/Contents/Info CFBundleIdentifier

com.apple.Preview

这会直接从应用程序包的 Info.plist 文件中提取 CFBundleIdentifier 值。

Defaults 还可以轻松处理二进制 plist,无需额外步骤。


3
这是更好的答案(特别是因为PlistBuddy不再是默认安装的),你应该选择它。 - Olie
26
请注意,默认值需要的是完整路径,而不是相对路径,即使你当前在包含要读取的 plist 文件的目录中也是如此。(奇怪!) - Olie
8
在某个目录中执行时,可以使用以下命令:defaults write $PWD/SomeMyDirectory/Info.plist CFBundleIdentifier "com.apple.Preview"。该命令将写入一个属性到指定的Info.plist文件中。 - iVader
4
如果一个脚本运行在资源文件夹内,你可以这样做:BUNDLEID=$(defaults read $(dirname $PWD)/Info CFBundleIdentifier)。原因是 Info.plist 文件在 Resources 文件夹的上一级目录中。 - Volomike
4
注意,man defaults 在 10.12 版本中提醒:警告:defaults 命令在未来的主要版本中将仅操作偏好设置域。一般的 plist 操作工具将被整合到另一个命令行程序中。 - Ben Lings
显示剩余5条评论

54

使用苹果公司的应用程序PlistBuddy,可以像这样将字符串分配给变量:

#!/bin/sh   
BUNDLE_ID=$(/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "${BUILD_ROOT}/${INFOPLIST_PATH}")

如果您在“运行脚本”构建阶段中运行此脚本,则BUILD_ROOT和INFOPLIST_PATH是由Xcode设置的变量。


1
PlistBuddy并不总是存在于系统中。如果您要分发该脚本,可以考虑使用defaults命令,正如其他答案所指出的那样。 - Boris Vidolov

9
这个命令对我非常有用:
/usr/libexec/PlistBuddy -c 'print ":CFBundleIdentifier"' Info.plist

4

您可以直接从构建产品中读取文件。但是,如果在编辑器中查看info.plist文件本身,您将看到shell变量本身。例如,Bundle ID具有以下shell命令:

com.yourcompany.${PRODUCT_NAME:rfc1034identifier}

您可以在任何Xcode运行的shell脚本中调用${PRODUCT_NAME:rfc1034identifier},它应该会填充相应内容。

听起来不错,虽然我还没有测试过。缺点是你无法获取捆绑标识符,只能获取其最后一部分,因此你需要在某个地方硬编码“com.mycompanyname”这部分... - Dimitris

3

在Mac上有一个命令行程序叫做PlistBuddy,它可以读取/写入plist中的值。在终端中键入“man PlistBuddy”以获取更多信息。


我已经尝试过 PlistBuddy 并且对它进行了很多操作。问题 是 PlistBuddy 可以打印捆绑标识符但不能返回它(它只返回 0 或 1)。所以作为一个 shell 菜鸟,我花费了一些时间将其赋值给变量。不过这是我设法让它工作的方式。现在我将发布我的答案。 - Dimitris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接