コマンドラインからOSXコード名を取得する

コマンドラインからOSXコード名を取得する

コマンドラインからOSXコード名(Yosemite、El Capitanなど)を取得する方法はありますか?はいいいえバージョン情報を探してください(例:

sw_vers -productVersion

)10.10などを提供します。ありがとうございます!

答え1

より簡単で信頼性の高い方法が必要であると確信していますが、少なくともwith(一致のみ印刷)と(拡張正規表現)をsed使用してパイプを完全に削除できます。grep-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にパイプできますが、-EBSDのsed悪名高いフラグを使用する逆参照は必要ありません。

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バージョン全体でこの情報を検索する一貫した方法を見つけようとしています。 Apple前の場所: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
}

これは効果があります安定して4つの最新のOS Xバージョンと他のバージョンから。

関連情報