Rufen Sie den OSX-Codenamen über die Befehlszeile ab


7

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!


2
Ich denke, es gibt keinen zuverlässigen Weg, dies innerhalb von Bash (Terminal) zu tun. Sogar 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
Sideshowbarker

1
Gibt es nicht nur zehn von ihnen? Warum nicht einfach die Versionsinformationen abrufen und mithilfe einer fest codierten Nachschlagetabelle übersetzen?
Wildcard

@wildcard: Das habe ich bisher gemacht, aber jedes Mal, wenn eine neue Version herauskommt, muss ich meine Bibliothek aktualisieren und neu verteilen ... Oder kennen Sie bereits die zukünftigen Namen?
lviggiani

Antworten:


5

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.)


In mindestens macOS Sierra müssen Sie den Teil "OS X" aus diesen entfernen, da in der Zeile jetzt "SOFTWARE-LIZENZVEREINBARUNG FÜR macOS Sierra" steht. Der Dateiname bleibt jedoch dankenswerterweise derselbe.
Ecmanaut

1

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.


1

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

Die http://support-sp.apple.com/Methode funktioniert ab 10.13 nicht mehr.
Stéphane Mottelet

1

Wie wäre es damit :

$ 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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.