有没有办法从命令行获取 OSX 代号(即 Yosemite、El Capitan 等)?我是不是寻找版本信息(例如
sw_vers -productVersion
)给出 10.10 等谢谢!
答案1
我确信必须有一种更简单、更可靠的方法,但至少您可以sed
通过使用grep
with -o
(仅打印匹配项) 和-E
(扩展正则表达式) 来完全消除管道:
grep -oE 'SOFTWARE LICENSE AGREEMENT FOR OS X.*[A-Z]' '/System/Library/CoreServices/Setup Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf'
但是,这也会返回SOFTWARE LICENSE AGREEMENT FOR OS X
输出的一部分。如果您只想要代号,您可以将其通过管道传递给 sed,但它不需要使用-E
BSDsed
臭名昭著的可怕标志进行任何反向引用:
grep -oE 'SOFTWARE LICENSE AGREEMENT FOR OS X.*[A-Z]' '/System/Library/CoreServices/Setup Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf' | sed "s/SOFT.*OS X //"
就我个人而言,我awk
更喜欢以下方法:
grep -oE 'SOFTWARE LICENSE AGREEMENT FOR OS X.*[A-Z]' '/System/Library/CoreServices/Setup Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf' | awk -F 'OS X ' '{print $NF}'
纯awk
解:
awk '/SOFTWARE LICENSE AGREEMENT FOR OS X/' '/System/Library/CoreServices/Setup Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf' | awk -F 'OS X ' '{print $NF}' | awk '{print substr($0, 0, length($0)-1)}'
(我确信有一种方法可以做到这一点,而无需通过管道连接到其他 awk 进程,但我不是专业人士。)
答案2
这个怎么样 :
$ sed -nE '/SOFTWARE LICENSE AGREEMENT FOR/s/([A-Za-z]+ ){5}|\\$//gp' /System/Library/CoreServices/Setup\ Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf
答案3
FWIW,这是一种丑陋的黑客方式;它可能既不太向前兼容,也不太向后兼容:
grep "SOFTWARE LICENSE AGREEMENT FOR OS X" \
"/System/Library/CoreServices/Setup Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf" \
| sed -E 's/^SOFTWARE LICENSE AGREEMENT FOR OS X (.+)\\$/\1/'
它至少可以在我检查过的 El Capitan 和 Mavericks 系统上运行(所以我假设在 Yosemite 上)。它返回全部大写的营销名称;例如,EL CAPITAN
和MAVERICKS
。
答案4
努力寻找一种跨 OS X 版本检索此信息的一致方法。苹果公司搬迁地点:OSXSoftwareLicense.rtf
High Sierra。我没有使用正则表达式来击中可能移动的目标,而是设计了以下内容:
#!/bin/bash
# Retrieve Apple's marketing name for installed operating system
# Take the number extracted from here; use it as a reference
osx_num=$(sw_vers -productVersion| awk -F '[.]' '{print $2}')
# Lookup table for OS X marketing names
OSX_MARKETING=(
["10"]="Yosemite"
["11"]="El Capitan"
["12"]="Sierra"
["13"]="High Sierra"
)
# Check if the number extracted is in array;
# if it is, print marketing name
osx_name () {
if [[ -n "${OSX_MARKETING[$osx_num]}" ]]; then
printf "%s\\n" "${OSX_MARKETING[$osx_num]}"
fi
}
这有效可靠地在 OS X 的四个最新版本以及可能的其他版本上。