从命令行获取 OSX 代号

从命令行获取 OSX 代号

有没有办法从命令行获取 OSX 代号(即 Yosemite、El Capitan 等)?我是不是寻找版本信息(例如

sw_vers -productVersion

)给出 10.10 等谢谢!

答案1

我确信必须有一种更简单、更可靠的方法,但至少您可以sed通过使用grepwith -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,但它不需要使用-EBSDsed臭名昭著的可怕标志进行任何反向引用:

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 CAPITANMAVERICKS

答案4

努力寻找一种跨 OS X 版本检索此信息的一致方法。苹果公司搬迁地点:OSXSoftwareLicense.rtfHigh 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 的四个最新版本以及可能的其他版本上。

相关内容