명령줄에서 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로 파이프할 수 있지만 -E
BSD의 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.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 버전 및 기타 버전에서.