Это перевод статьи с сайта https://scriptingosx.com/2020/09/macos-version-big-sur-update/.
Следование версиям ПО – удивительно сложная задача. Номер версии передает техническую информацию: сколько изменений можно ожидать в новой версии и может ли это нарушить существующие рабочие процессы и отразиться на данных? Пользователи охотнее заплатят за мажорное обновление, обладающее новыми функциями, поэтому номер версии зачастую используется как маркетинговый инструмент. Но для разработчиков и администраторов Mac, номер версии должен быть как можно более подробным, в идеале он должен иметь уникальный номер для каждой сборки.
Из-за этих, иногда противоположных интересов, неудивительно, что ориентированность на версию часто становится проблемой для администраторов Mac.
Краткая история версий операционных систем Mac
До появления названия Mac OS операционная система для Macintosh называлась System 7. Система Mac OS 8 с кодовым название Copland, должна была стать новой операционной системой со всеми новыми возможностями, но проект забуксовал, а затем и вовсе был отменен. Обновление System 7.7 было переименовано в Mac OS 8, чтобы освободить Apple от некоторых лицензионных обязательств перед сторонними компаниями, срок действия которых истекал для Mac OS 8. Маркетинговые и юридические вопросы сыграли ключевую роль в выборе номера версии (но это не был голый маркетинг: Mac OS 8 все же получила новый дизайн интерфейса, который создавался для Copland).
Когда Apple в конце девяностых объявила о переходе платформы Macintosh на новые рельсы NextSTEP, в компании решили не менять название и нумерацию версий. Вместо этого они назвали новую систему Mac OS X, где “X” читалась как “ten”, римская цифра десять. Я полагаю, что этот выбор был обусловлен маркетингом, чтобы продемонстрировать преемственность версий, которыми были Mac OS 8 и Mac OS 9.
Первая версия Mac OS X имела цифровую версию под номером 10.0.0 и получила четыре минорных обновления вплоть до 10.0.4. Затем вышло первое мажорное обновление до 10.1. Это нарушило традицию нумерацией версий, так как до этого мажорные обновления системы должны были получать новый порядковый номер. Когда “Mac OS X 10.2 Jaguar” была анонсирована на WWDC в 2002 году, стало очевидно, что теперь Apple считает Mac OS X брендом и будет и далее придерживаться “10” (десятки) в номерах версий своих ОС.
С выходом сервера Xserve, префикс “X” стала обозначать “профессиональное” или “eXpert” оборудование Apple. В отличие от префикса “i”, используемого в устройствах и ПО для широких масс. (iMac, iBook, iPod, iTunes, iMovie, iPhoto и т. д.). Позже этот префикс стали использовать такие “профессиональные” программные инструменты, как Xcode, Xsan и Xgrid. Смущает то, что начальная “X” произносилась как “ecks”, в то время как последняя “X” в “Mac OS X” произносилась как “ten”. По крайней мере, на этом настаивал маркетинговый отдел Apple.
В 2012 году Apple выкинула “Mac” из названия OS X Mountain Lion (10.8). “X” символизировала собой “Pro” направление платформы Mac, в отличие от “iOS” для iPhone и iPad. Видимо, “Х” тогда считался более сильным брендом для “Pro”, чем “Mac”….
Это изменилось в 2016 году, когда Apple, наконец, отбросила “X-as-ten” и вернула “Mac” с выходом “macOS Sierra” (10.12).
Даже без “X” в названии системы, “10” оставалась в номере версии до macOS 10.15 Catalina.
(X-as-ten) продолжает жить в Final Cut Pro X и Logic Pro X. Префикс “X” и поныне живет в Xcode).
Big Sur — переход на 11
Названия и номера версий ОС Mac во многом были обусловлены символизмом, маркетингом и даже юридическими аспектами. То же самое справедливо и для этого года: Apple отказалась от “10” и увеличила мажорную версию macOS до 11.
Я уже писал по этому поводу – a post on my opinion and reaction to macOS 11
Когда вы откроете раздел “Об этом Mac” в бета-версии Big Sur, окно вам с гордостью сообщит, что система работает на macOS 11.0. Вы получите тот же результат, если запустите sw_vers:
$ sw_vers -productVersion
11.0
Кажется все просто, однако тут есть подвох.
10.16 против 11.0
Big Sur не всегда отображает версию macOS 11.0 . В некоторых случаях это будет 10.16. Такое случается, когда ПО проверяет только вторую часть версии ОС.
Это подробно описано в посте Howard Oakley.
В Big Sur вы можете форсировать режим совместимости, установив переменной окружения SYSTEM_VERSION_COMPAT значение 1:
$ export SYSTEM_VERSION_COMPAT=1
$ sw_vers -productVersion
10.16
Проверяя версию
Ранее, в вашем скрипте проверяющим версию macOS (или Mac OS X, или OS X), было безопасно проигнорировать первый номер версии продукта и сравнивать только второй. Например, чтобы узнать какая версия ОС используется, macOS Mojave или более новая, вы вероятно сделали бы что-то типа:
minorVersion=$(sw_vers -productVersion | awk -F. '{ print $2; }')
if [[ $minorVersion -ge 14 ]]; then
echo "Mojave or higher"
fi
Теперь, с выходом macOS 11.0, этот скрипт вернет 0 для переменной minorVersion и даст сбой.
Очевидным решением здесь будет получить переменную “majorVersion” и сравнить их первым делом:
majorVersion=$(sw_vers -productVersion | awk -F. '{ print $1; }')
minorVersion=$(sw_vers -productVersion | awk -F. '{ print $2; }')
if [[ $majorVersion -ge 11 || $minorVersion -ge 14 ]]; then
echo "Mojave or higher"
fi
Это отработает даже тогда, когда скрипт запускается в окружении, где он может получить 10.16 в качестве номера версии. Но это не особенно приятно для глаз. Кроме того, когда вы захотите сравнить версии установленных обновлений, это будет (предположительно) “minorVersion” для Big Sur и новее, и третья часть номера в версии в Catalina и ранее — путаница будет быстро расти.
Может быть существует способ сделать это лучше, чем использовать “маркетинговую” версию macOS?
Версия сборки
Как я уже упоминал ранее, версия, видимая пользователю, может быть недостаточно детализированной для нужд разработчиков. И из-за этого в macOS есть вторая версия, называемая “версией сборки”.
Версия сборки для текущей версии macOS Catalina, это 19G2021.
$ sw_vers -buildVersion
19G2021
Вы также можете увидеть версию сборки в разделе “Об этом Mac”, если щелкнете на номер версии.
Версия сборки состоит из трёх частей и четвёртой дополнительной. Первый номер – версия ядра Darwin. Следующая заглавная буква означает очередность обновления. Следующая цифра (до четырех знаков) – это возрастающий номер сборки. Иногда за номером сборки следует строчная буква.
Версия Darwin
Этот номер версии берет свое начало от ядра Darwin в macOS.
Версия Darwin – это число, которое увеличивается в каждом мажорном релизе macOS. Система Mac OS X 10.2 Jaguar была первым релизом Mac OS X, в котором отображалась версия Darwin 6. Из этого можно сделать вывод, что в 10.0 была Darwin версия 4, что вполне логично, поскольку это был четвертый релиз NextSTEP, на котором когда то была основана Mac OS X.
macOS 10.15 Catalina, имеет версию Darwin 19, а Big Sur показывает версию 20.
Вы также можете проверить версию Darwin в оболочке shell из переменной среды OSTYPE:
$ echo $OSTYPE
darwin19.0
Но имейте в виду, что переменная окружения может отсутствовать, в зависимости от условий в которых работает ваш скрипт.
Более безопасным способом получить версию Darwin является команда uname:
$ uname -r
19.6.0
Эта версия Darwin включает в себя информацию об обновлении.
Обновления
В версии сборки обновления обозначаются заглавной буквой. Буква “А” обозначает .0 или первый релиз мажорной версии. Буква “В” обозначает .1 или первое минорное обновление, и так далее.
Текущая версия сборки Catalina начинается с 19G, поэтому мы знаем, что это седьмой или шестой релиз Catalina (10.15.6). Текущая бета-версия Big Sur начинается с 20A, так что это первый релиз или версия .0 .
Номер сборки
Номера сборки чаще всего имеют значение в бета-версии. В то время, как версия Darwin и буква обновления фиксируются на этапе бета-тестирования, номер сборки увеличивается с каждой новой бета-версией. Это число, которое наиболее подробно характеризует версию.
Для каждого минорного и мажорного обновления нумерация сборки начинается заново, поэтому ее версию можно использовать только для сравнения разных версий одного и того же мажорного релиза с минорным обновлением.
Традиционно существовала разница между двух- и трехзначными номерами сборки, и четырехзначными. Сборки с меньшим количеством цифр были универсальными, которые будут работать на всех компьютерах Mac, поддерживающих эту версию macOS. Четырехзначные номера сборки означали либо обновление безопасности, либо сборку специфичную для определенных моделей Mac.
Аппаратно-специфичные сборки могут выпускаться с выходом новой модели Mac. Обычно это происходит потому, что драйверы, необходимые для нового аппаратного обеспечения, не включены в текущую общую версию ОС. Несмотря на то, что номера версий macOS совпадают как для универсального, так и для аппаратно-специфичного релиза, они имеют разные номера сборки.
Обычно драйверы для определенных моделей устройств объединяются в универсальный релиз при следующем минорном обновлении. Однако, до тех пор, администраторам Mac приходится уделять особое внимание аппаратно-специфичным установщикам системы и рабочим процессам затрагивающим новые модели Mac. Это было особенно раздражающе с выходом MacBook Pro 2018, который имел специфичную сборку 10.13.6, но которая так и не была объединена в универсальную сборку 10.13. Администраторы Mac которые должны были поддерживать 10.13, были вынуждены использовать отдельную программу установки для этих MacBook.
Интересно, что в бета-версия Big Sur все по другому: её номер сборки начался с 4000-х номеров и перескочил на 5000-е с выходом бета-версии 3.
Специальные сборки
В некоторых релизах macOS за номером сборки стоит строчная буква. Это особенно распространено на этапе бета-тестирования. Неясно, что именно она означает. Например она может говорить о том, что установщик был пересобран один или более раз.
Вы можете использовать регулярные выражения для разделения всех частей сборки:
if [[ $buildVersion =~ ([[:digit:]]{1,2})([[:upper:]])([[:digit:]]+)(.*) ]]; then
darwinVersion=$match[1]
updateLetter=$match[2]
buildNumber=$match[3]
specialBuild=$match[4]
else
echo "couldn't parse build version"
exit 2
fi
Но в большинстве случаев вам не понадобится такой уровень детализации.
Использование версии сборки
Версия сборки позволяет сравнивать релизы системы macOS, не завися от прихотей маркетинга. Мы даже можем использовать ее, чтобы бы отличить аппаратно-специфичную сборку macOS от универсальной сборки или определить, включает ли она в себя обновления безопасности или дополнительные обновления.
В большинстве случаев нам понадобится знать только версию Darwin и, возможно, номер обновления.
Версия Darwin имеет две цифры, начиная с Mac OS X 10.6 Snow Leopard. Можно с уверенностью предположить, что вы больше не будете управлять Mac с 10.5 Leopard. (А если будете, то скорее всего, они будут администрироваться вручную и не будут зависеть от автоматизаций по установке обновлений). Предположив, что версия Darwin имеет две цифры, мы можем использовать сравнение строк для определения версий сборок:
# check if Mojave or higher
if [[ $(sw_vers -buildVersion) > "18" ]]; then
…
Так как все версии Mojave начинаются с 18A… они все в алфавитном порядке больше 18. То же самое произойдет, если вы захотите проверить максимальную версию macOS:
# check if Mojave or earlier
if [ $(sw_vers -buildVersion) < "19" ]; then
…
Вы также можете отфильтровать результат для определенных минимальных версий обновлений:
# check if Mojave 10.14.6 or later
if [ $(sw_vers -buildVersion) > "18E” ]; then
…
Используя версию сборки, мы избегаем всех проблем, которые могут привнести “маркетинговые” версии ОС.
Решение с zsh
Вышесказанное работает для скриптов на sh, bash и zsh. Однако, когда вы используете zsh, есть еще один полезный инструмент. zsh предоставляет функцию сравнения версий, называемую is-at-least.
Когда вы используете zsh в Терминале интерактивно, функция вероятно уже загружена, но для использования ее в скриптах, вы должны использовать autoload, чтобы убедиться в том что она загружена. После этого вы сможете использовать is-at-least следующим образом:
autoload is-at-least
# check for Mojave or higher
if is-at-least 10.14 $(sw_vers -productVersion); then
…
Поскольку при сравнении 11.0 и 10.16 будут превышать 10.14, проверка будет срабатывать вне зависимости от того, какое число отобразится в Big Sur. Но если вы захотите проверить, является ли версия системы Big Sur, вам понадобится использовать 10.16 в качестве минимальной версии, которая охватит оба возможных значения:
autoload is-at-least
# check for Big Sur or higher
if is-at-least 10.16 $(sw_vers -productVersion); then
…
Заключение
Смена номера версии macOS 11 Big Sur может повлиять или даже прервать проверку версии системы в некоторых автоматизациях развертывания и скриптах управления. Всегда найдется несколько простых решений, которые будут более устойчивы к “маркетинговым” изменениям версии продукта.