Как узнать «понятное имя» операционной системы из оболочки/терминала/bash?

Об этом Mac с обведенным словом «Мохаве»

Я знаю, что я могу использовать sw_ver, чтобы найти эту информацию:

ProductName:    Mac OS X
ProductVersion: 10.14
BuildVersion:   18A353d

… и я знаю, что могу найти другие вещи, например, unameможет дать мне некоторые типы информации об ОС и system_profiler SPSoftwareDataTypeможет дать мне дополнительную информацию, но я хочу найти «дружественное» имя, такое как «Мохаве» на изображении, показанном выше.

Как найти «дружественное» имя, используя shell/Terminal/bash/etc?

До сих пор мой Google fu не смог найти никаких решений. Все результаты, кажется, возвращаются к тем командам, которые я упомянул выше, но ни одна из них не дает мне правильной информации.

Он должен быть где-то там… как его найти?

Указав, что правильный ответ будет просто получить номер любым способом и иметь собственную таблицу поиска для имени.
Я заявляю, что sw_verэто маркетинговое название явно должно исходить от этой команды. Я провел много поисков в поисках этого, и я предполагаю, что вам понадобится очень непрямой способ получить это из установленных обновлений с именем.
Почему? Это легко определить, все имена известны, и все, что вам нужно сделать, это проиндексировать список. Ниже я привожу (плохой) Applescript.

Ответы (3)

Автономный метод

Эта команда должна найти то, что вы ищете:

awk '/SOFTWARE LICENSE AGREEMENT FOR macOS/' '/System/Library/CoreServices/Setup Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf' | awk -F 'macOS ' '{print $NF}' | awk '{print substr($0, 0, length($0)-1)}'

Он основан на ответе, найденном здесь . Он протестирован для работы в High Sierra и должен работать в Мохаве.

Онлайн-метод

Вы также можете сделать это онлайн (что на самом деле заполняет диалоговое окно «Об этом Mac», показанное в вопросе):

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

Эта команда запросит у сервера Apple версию вашего продукта и извлечет имя ОС из XML-ответа. Чтобы увидеть полный XML-ответ, просто опустите --xpath "//root/configCode/text()"параметр:

curl -s https://support-sp.apple.com/sp/product?edid=$( sw_vers -productVersion ) | xmllint --format  -

Ответ:

<?xml version="1.0" encoding="utf-8"?>
<root>
   <name>CPU Name</name>
   <configCode>macOS High Sierra</configCode>
   <locale>en_US</locale>
</root>
К сожалению, это дает мне «High Sierra» в качестве вывода на моей машине Mojave. В файле нет слова «Мохаве».
также по той же ссылке кто-то предложил это, что тоже не работает (ничего не возвращает):VER="$(sw_vers -productVersion)"; curl -s "http://support-sp.apple.com/sp/product?edid=$VER"
Вероятно, это потому, что они еще не обновили файл для Мохаве. Онлайн-сервис, похоже, больше не работает, так как я не могу заставить его отвечать на какие-либо запросы. Это займет больше копать
Мне удалось заставить работать второй. Вам нужно https, поскольку Apple будет игнорировать соединения без SSL. Я также добавил xmllintфильтр для извлечения данных, которые вы ищете.
У меня нет машины до Sierra, чтобы проверить, но не сработает ли описанный выше «автономный» метод, pre-Sierra? До этого он не называл себя «macOS». Я не сторонник решений, в которых компьютер должен иметь подключение к Интернету.
@MarcWilson - этот ответ был написан с учетом новой macOS и более поздних версий. Если вы хотите El Capitan и более ранние версии, измените его на «OS X».
Я получаю сообщение об ошибке «0900»: $ curl -s https://support-sp.apple.com/sp/product?edid=$( sw_vers -productVersion )возвращается <?xml version="1.0" encoding="utf-8" ?><root><error>0900</error><locale>en_US</locale></root>на 10.13.6 (и любое другое значение, которое я там использую)
@johnnyB - я только что проверил это, и у меня все работает нормально. Возможно, вы используете Хакинтош?
так 10.13.6 не работает! $ curl -s "https://support-sp.apple.com/sp/product?edid=10.13.6"Не работает, но curl -s "https://support-sp.apple.com/sp/product?edid=10.12.6"работает!!!
@Allan, онлайн-метод несовместим. Смотрите мои новые вопросы на apple.stackexchange.com/questions/341551/…

Что ж, я, наконец, отказался от поиска решения — возможно, мы найдем его после того, как Mojave выйдет в финальной версии, но, очевидно, это будет не то, что можно легко использовать в старых версиях Mac OS X / OS X / macOS.

Поэтому я сделал альтернативу идее Марка Уилсона (см. выше) и создал сценарий оболочки, который может либо вывести полный список всех номеров версий и их «понятных имен», либо позволит вам искать конкретное имя, например, если вы просто хотите знать, какая версия называлась «Йосемити».

Вы можете найти мой скрипт здесь: https://github.com/tjluoma/macosxnames/blob/master/macosxnames.sh

Я оставлю вопрос открытым на случай, если мы найдем решение, не требующее внешнего сценария.

Обновление (более года спустя)

Apple теперь поддерживает веб-страницу со всеми именами и соответствующими номерами: https://support.apple.com/en-us/HT201260 .

Вы можете получить список, используя это:

(echo "<table>" ; curl -sfLS "https://support.apple.com/en-us/HT201260" \
| tidy --tidy-mark no --char-encoding utf8 --wrap 0 --show-errors 0 --show-warnings no --clean yes --force-output yes --output-xhtml yes --quiet yes \
| sed -e '1,/<table/d; /<\/table>/,$d' -e 's#<br />##g' ; echo "</table>" ) \
| lynx -dump -nomargins -width='10000' -assume_charset=UTF-8 -pseudo_inlines -stdin -nonumbers -nolist

Дает этот вывод:

        macOS         Latest version
macOS Monterey        12.4
macOS Big Sur         11.6.7
macOS Catalina        10.15.2
macOS Mojave          10.14.6
macOS High Sierra     10.13.6
macOS Sierra          10.12.6
OS X El Capitan       10.11.6
OS X Yosemite         10.10.5
OS X Mavericks        10.9.5
OS X Mountain Lion    10.8.5
OS X Lion             10.7.5
Mac OS X Snow Leopard 10.6.8
Mac OS X Leopard      10.5.8
Mac OS X Tiger        10.4.11
Mac OS X Panther      10.3.9
Mac OS X Jaguar       10.2.8
Mac OS X Puma         10.1.5
Mac OS X Cheetah      10.0.4

Опять же, Apple не очень хорошо поддерживает документацию в Интернете, поэтому через год или два она может исчезнуть.

Спасибо за этот список. stackoverflow.com/a/72722226/1896134 Я обновил это и создал скрипт Python для динамического поиска и сравнения версий. Теперь я могу получить имя ОС в python, sw_versразобрав переменные и сравнив их со списком. Github: github.com/JayRizzo/JayRizzoTools/blob/master/pyMacOsName.py
set _delim to AppleScript's text item delimiters
set AppleScript's text item delimiters to "."
set os_version to the second item of (the text items of (do shell script "sw_vers -productVersion"))
set AppleScript's text item delimiters to _delim

set osList to { "Puma", "Cheetah", "Jaguar", "Panther", "Tiger", "Leopard", "Snow Leopard",¬
                "Lion", "Mountain Lion", "Mavericks", "Yosemite", "El Capitan", "Sierra", "High Sierra"}

return item (os_version+1) of osList

Это пример.

Сценарий действительно решает задачу, но не масштабируется. Его нужно будет обновлять с каждым основным выпуском macOS. Похоже, что цель состоит в том, чтобы выяснить механизм, встроенный в macOS (или используя информацию, встроенную в ОС), который может раскрыть маркетинговое название выпуска.
@NimeshNeema, однако, это единственное решение, которое дает правильный ответ.
Пока вы раскошеливаетесь, вы можете использовать следующее, чтобы заменить первые 4 строки вашего скрипта:set os_version to (do shell script "sw_vers -productVersion | awk -F. '{print $2}'")
На самом деле, если бы я собирался это сделать, я бы сделал все это в awk. :) Мне нравится awk.