如何在OSX终端中返回应用程序版本

13

我需要在Mac osX 10.10上的.sh脚本中使用应用程序版本号,以便我可以将其与另一个数字进行比较,从而强制更新或不更新。

到目前为止,我有以下代码(我以Firefox.app作为示例)

FirefoxmdlsVersion= mdls -name kMDItemVersion /Applications/Firefox.app;
echo $FirefoxmdlsVersion

这返回了kMDItemVersion = "34.0",这是朝着正确方向迈出的一步,但我只需要数字,以便进行比较示例:340

以下是我尝试使用新变量执行的操作,但我没有得到任何错误或输出。

FFV2=${FirefoxmdlsVersion//'kMDItemVersion ='}
FFV3=${FirefoxmdlsVersion:18:4}

也许我在错误的方向上,我看了一篇帖子但没有取得任何进展。有人能帮帮我吗?

6个回答

13
如果您已安装Xcode和开发人员工具,则始终可以使用PlistBuddy...。
例如:
/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" /Applications/TextEdit.app/Contents/Info.plist

在Yosemite下,它会给我返回版本号为"1.10"。

任何应用程序的Info.plist文件通常在"CFBundleShortVersionString"键下有一个版本号。


这个能在登录钩子脚本中工作吗?我希望在运行脚本的客户端站点上不需要安装任何东西。 - ShawnIT

4
你也可以使用tr
FirefoxmdlsVersion= mdls -name kMDItemVersion /Applications/Firefox.app | tr -d ".";

这会产生 3405 (来自 Firefox 34.0.5)


3
你可以使用-raw标记代替tr命令:FirefoxmdlsVersion= mdls -raw -name kMDItemVersion /Applications/Firefox.app - icecream
@icecream - OP 希望删除 .,而 -raw 并不能做到这一点。但是 -raw 除了带有点的数字(甚至包括换行符)之外,会删除其他所有内容,因此如果需要的只是数字,则 -rawtr 都可以产生相同的结果。 - CRD
此解决方案需要将应用程序索引到MacOSX Spotlight中。 - Petr B.

4
为了在列表中添加更多选项,您还可以使用defaults工具。
例如: defaults read /Applications/Firefox.app/Contents/Info.plist CFBundleShortVersionString 将输出来自Firefox的Info.plist文件的CFBundleShortVersionString条目的值,例如:74.0 我更喜欢使用defaults命令,因为使用它没有任何前提条件,而且该命令非常简单。

2

Shell:

plutil -p /Applications/Firefox.app/Contents/Info.plist | awk '/CFBundleShortVersionString/ {print substr($3, 2, length($3)-2)}'

或者Python:

import plistlib
plistlib.readPlist('/Applications/Firefox.app/Contents/Info.plist')['CFBundleShortVersionString']

2
请在MAC终端中尝试以下命令。
system_profiler SPApplicationsDataType |grep "Application Name" -A 8

1
cat /Applications/Firefox.app/Contents/Info.plist | grep -A1 CFBundleShortVersionString | grep string | sed 's/<[^>]*>//g'

这将进入 Firefox 的 Info.plist 并返回捆绑包的版本号。它最后要做的事情是从版本周围删除标签,以获得干净的输出。


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