Gibt es eine Möglichkeit, den OSX-Codenamen (z. B. Yosemite, El Capitan usw.) über die Befehlszeile abzurufen? Ich suche keine Versionsinformationen (z
sw_vers -productVersion
) was 10.10 usw. gibt Danke!
Gibt es eine Möglichkeit, den OSX-Codenamen (z. B. Yosemite, El Capitan usw.) über die Befehlszeile abzurufen? Ich suche keine Versionsinformationen (z
sw_vers -productVersion
) was 10.10 usw. gibt Danke!
Antworten:
Ich bin mir sicher, dass es einen einfacheren und zuverlässigeren Weg geben muss, aber zumindest können Sie die Pipe sedvollständig entfernen, indem Sie grepwith -o(druckt nur Übereinstimmungen) und -E(erweiterte reguläre Ausdrücke) verwenden:
grep -oE 'SOFTWARE LICENSE AGREEMENT FOR OS X.*[A-Z]' '/System/Library/CoreServices/Setup Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf'
Dies gibt jedoch auch den SOFTWARE LICENSE AGREEMENT FOR OS XTeil der Ausgabe zurück. Wenn Sie nur den Codenamen möchten, können Sie ihn an sed weiterleiten, aber es wären keine Rückverweise unter Verwendung der gefürchteten -EFlagge erforderlich , für die BSD sedso berüchtigt ist:
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 //"
Ich persönlich bevorzuge awkstattdessen die Methode:
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}'
Reine awkLösung:
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)}'
(Ich bin mir sicher, dass es eine Möglichkeit gibt, dies zu tun, ohne zusätzliche awk-Prozesse zu leiten, aber ich bin kein Profi.)
FWIW, hier ist ein flüchtiger, hackiger Weg. es ist wahrscheinlich weder sehr vorwärts- noch rückwärtskompatibel:
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/'
Es funktioniert zumindest auf den von mir überprüften El Capitan- und Mavericks-Systemen (und daher würde ich von Yosemite ausgehen). Es gibt den Marketingnamen in Großbuchstaben zurück. zB EL CAPITANund MAVERICKS.
In diesem Blogbeitrag habe ich erfahren, dass Apple über einen Webdienst verfügt, mit dem Sie den Marketingnamen von macOS für Versionen 10.7+ abfragen können. Sie können ihm die macOS-Versionsnummer geben, für die Sie den Marketingnamen benötigen, und es wird XML mit dem Marketingnamen zurückgegeben.
curl -s http://support-sp.apple.com/sp/product?edid=10.12.6
Rückgabe (für Anzeigezwecke formatiert)
<?xml version="1.0" encoding="utf-8" ?>
<root>
<name>CPU Name</name>
<configCode>macOS Sierra</configCode>
<locale>en_US</locale>
</root>
Wenn Sie den Marketingnamen für die Version von macOS erhalten möchten, die Sie gerade ausführen, können Sie den einen Liner ausführen
curl -s http://support-sp.apple.com/sp/product?edid=$(sw_vers -productVersion) |
xmllint --xpath '/root/configCode/text()' -
http://support-sp.apple.com/Methode funktioniert ab 10.13 nicht mehr.
Es wurde nach einer konsistenten Methode zum Abrufen dieser Informationen in allen OS X-Versionen gesucht. Apple hat den Standort von: OSXSoftwareLicense.rtfin High Sierra verlegt. Anstatt reguläre Ausdrücke zu verwenden, um ein Ziel zu treffen, das sich bewegen könnte, habe ich Folgendes entwickelt:
#!/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
}
Dies funktioniert zuverlässig auf den vier neuesten Versionen von OS X und wahrscheinlich auch auf anderen.
system_profiler(was eine ziemlich erschöpfende Reihe von Informationen ausspuckt) enthält diese Namen nicht (was Apple meiner Meinung nach als "Marketing-Version" bezeichnet). Vielleicht versuchen Sie, ein Problem zu lösen, indem Sie nach diesem Codenamen suchen? Wenn ja, seien Sie vorsichtig, dass Sie nicht in das XY-Problem fallen. • xyproblem.info