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 sed
vollständig entfernen, indem Sie grep
with -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 X
Teil 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 -E
Flagge erforderlich , für die BSD sed
so 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 awk
stattdessen 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 awk
Lö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 CAPITAN
und 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.rtf
in 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