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!
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!
Câu trả lời:
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ỏ sed
hoàn toàn đường ống bằng cách sử dụng grep
vớ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 X
phầ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 -E
cờ đáng sợ mà BSD sed
rấ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 awk
phươ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}'
awk
Giả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.)
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 CAPITAN
và MAVERICKS
.
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()' -
http://support-sp.apple.com/
phương pháp không làm việc nữa cho 10.13 và cao hơn.
Đấ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.
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 đề XY • xyproblem.info