Nhận tên mã OSX từ dòng lệnh


7

Có cách nào để lấy tên mã OSX (Ie Yosemite, El Capitan, v.v.) từ dòng lệnh không? Tôi không tìm kiếm thông tin Phiên bản (ví dụ:

sw_vers -productVersion

) cung cấp 10.10 vv Cảm ơn!


2
Tôi nghĩ rằng không có cách nào đáng tin cậy để làm điều này từ bên trong bash (Terminal). Ngay cả system_profiler(trong đó đưa ra một bộ thông tin khá đầy đủ) không bao gồm những cái tên đó (mà tôi nghĩ Apple gọi là phiên bản tiếp thị trên mạng). Có lẽ bạn đang cố gắng giải quyết vấn đề bằng cách tìm tên mã đó? Nếu vậy, hãy cẩn thận bạn không rơi vào vấn đề XYxyproblem.info
sideshowbarker

1
Không phải chỉ có mười người trong số họ sao? Tại sao không lấy thông tin phiên bản và dịch nó bằng bảng tra cứu được mã hóa cứng?
tự đại diện

@wildcard: đây là những gì tôi đã làm cho đến nay nhưng mỗi khi có phiên bản mới xuất hiện, tôi phải cập nhật và phân phối lại thư viện của mình ... Hay bạn đã biết tên tương lai chưa?
lviggiani 7/10/2015

Câu trả lời:


5

Tôi chắc chắn rằng có một cách dễ dàng và đáng tin cậy hơn, nhưng ít nhất bạn có thể loại bỏ sedhoàn toàn đường ống bằng cách sử dụng grepvới -o(chỉ in trùng khớp) và -E(biểu thức chính quy mở rộng):

grep -oE 'SOFTWARE LICENSE AGREEMENT FOR OS X.*[A-Z]' '/System/Library/CoreServices/Setup Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf'

Điều này, tuy nhiên, cũng trả lại SOFTWARE LICENSE AGREEMENT FOR OS Xphần đầu ra. Nếu bạn chỉ muốn tên mã, bạn có thể chuyển nó thành sed, nhưng nó sẽ không yêu cầu bất kỳ tài liệu tham khảo ngược nào sử dụng -Ecờ đáng sợ mà BSD sedrất khét tiếng:

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 //"

Cá nhân, tôi thích awkphương pháp thay thế:

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}'

awkGiải pháp tinh khiết :

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)}'

(Tôi chắc chắn có một cách để làm điều đó mà không cần chuyển sang các quy trình awk bổ sung, nhưng tôi không phải là dân chuyên nghiệp.)


Trong ít nhất macOS Sierra, bạn cần xóa phần "OS X" khỏi phần này, vì dòng này hiện có dòng chữ 'HỢP ĐỒNG CẤP PHÉP PHẦN MỀM CHO macOS Sierra`. Tên tập tin rất may vẫn giữ nguyên, mặc dù.
ecmanaut

1

FWIW, đây là một cách khó khăn; nó có lẽ không tương thích lắm - cũng không tương thích ngược:

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/'

Nó hoạt động ít nhất trên các hệ thống El Capitan và Mavericks mà tôi đã kiểm tra (và vì vậy tôi sẽ giả sử trên Yosemite). Nó trả về tên tiếp thị trong tất cả các mũ; ví dụ, EL CAPITANMAVERICKS.


1

Từ bài đăng trên blog này , tôi biết rằng Apple có một dịch vụ web mà bạn có thể truy vấn tên tiếp thị của macOS cho các phiên bản 10.7+. Bạn có thể cung cấp cho nó số phiên bản macOS mà bạn cần tên tiếp thị và nó sẽ trả về XML với tên tiếp thị.

curl -s http://support-sp.apple.com/sp/product?edid=10.12.6

Trả về (được định dạng cho mục đích hiển thị)

<?xml version="1.0" encoding="utf-8" ?>
<root>
    <name>CPU Name</name>
    <configCode>macOS Sierra</configCode>
    <locale>en_US</locale>
</root>

Nếu bạn muốn có được tên tiếp thị cho phiên bản macOS mà bạn hiện đang chạy, bạn có thể chạy một lớp lót

curl -s http://support-sp.apple.com/sp/product?edid=$(sw_vers -productVersion) |
xmllint --xpath '/root/configCode/text()' -

Các http://support-sp.apple.com/phương pháp không làm việc nữa cho 10.13 và cao hơn.
Stéphane Mottelet

1

Còn cái này thì sao :

$ sed -nE '/SOFTWARE LICENSE AGREEMENT FOR/s/([A-Za-z]+ ){5}|\\$//gp' /System/Library/CoreServices/Setup\ Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf

0

Đấu tranh cho một cách nhất quán để lấy thông tin này trên các phiên bản OS X. Apple đã chuyển vị trí của: OSXSoftwareLicense.rtfở High Sierra. Thay vì sử dụng các biểu thức thông thường để bắn trúng mục tiêu có thể di chuyển, tôi đã nghĩ ra những điều sau:

#!/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
}

Điều này hoạt động đáng tin cậy trên bốn phiên bản OS X mới nhất và có thể là các phiên bản khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.