Обнаружение Apple Silicon из командной строки

Как я могу определить из сценария оболочки, что он работает на оборудовании Apple M1?

Я хочу иметь возможность запускать команду командной строки, чтобы я мог написать if-оператор, тело которого будет выполняться только при запуске на Mac с процессором M1 (и, по крайней мере, macOS Big Sur, естественно).

uname -p, вероятно, даст вам нужную информацию, но у меня нет M1 для тестирования.
chepner 11.12.2020 23:13
Проверено. Оно работает.
aheze 11.12.2020 23:15

да так даже лучше было. Опубликуйте это как ответ, и я приму его

Klas Mellbourn 11.12.2020 23:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
61
3
26 607
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
uname -m

вернется arm64, а не x86_64

if [[ $(uname -m) == 'arm64' ]]; then
  echo M1
fi

или, как предложил @chepner

uname -p

вернется arm, а не i386

if [[ $(uname -p) == 'arm' ]]; then
  echo M1
fi

еще один инструмент arch:

if [[ $(arch) == 'arm64' ]]; then
  echo M1
fi

Обратите внимание, что пользователи M1 могут запускать терминал в режиме Rosetta. В этом случае «uname -m» возвращает «x86_64».

Nusatad 08.01.2021 18:33

это не только при запуске терминала в Rosetta, но и в том случае, если какой-либо процесс, запускающий сценарий, также выполняется в Rosetta. Если кто-то запустит это в сценарии, развернутом, скажем, RMM, который работает через Rosetta, вы получите x86_64. я думаю, что подход sysctl - лучшее решение для поиска «Apple» в строке: [[ $(sysctl -n machdep.cpu.brand_string) =~ "Apple" ]]

bheinz 16.12.2021 18:38

Это вообще не работает! Если вы находитесь в ядре VSCode Jupyter, он скажет x86_64, хотя я использую M2 Max. Это sysctl -n machdep.cpu.brand_string лучшая команда.

Maziyar 10.03.2023 11:19

@Maziyar «совсем не работает» — это преувеличение. Если ваш «VSCode Jupyter» сообщает x86_64, то этот процесс выполняется через эмулятор Rosetta, что, вероятно, не то, что вам нужно, поскольку и VSCode, и Jupyter поддерживают Apple Silicon.

Klas Mellbourn 10.03.2023 14:15

с учетом того, что я должен был сказать, ненадежен в зависимости от того, где он выполняется.

Maziyar 11.03.2023 19:13

При использовании родной оболочки скажите /bin/bash -i или /bin/zsh -i, ответ Класа Меллборна работает, как и ожидалось.

Если используется оболочка, которая была установлена ​​через установку Intel/Rosetta Homebrew, то uname -p возвращает i386, а uname -m возвращает x86_64, как указано в комментарии Datasun.


Чтобы получить что-то, что работает в разных средах (Apple Silicon Native, Rosetta Shell, Linux, Raspberry Pi 4s), я использую следующее из экосистемы dorothy dotfile:

is-mac && test "$(get-arch)" = 'a64'

Если вы не используете dorothy, соответствующий код от dorothy:

https://github.com/bevry/dorothy/blob/1c747c0fa6bb3e6c18cdc9bae17ab66c0603d788/commands/is-mac

test "$(uname -s)" = "Darwin"

https://github.com/bevry/dorothy/blob/1c747c0fa6bb3e6c18cdc9bae17ab66c0603d788/commands/get-arch

arch = "$(uname -m)"  # -i is only linux, -m is linux and apple
if [[ "$arch" = x86_64* ]]; then
    if [[ "$(uname -a)" = *ARM64* ]]; then
        echo 'a64'
    else
        echo 'x64'
    fi
elif [[ "$arch" = i*86 ]]; then
    echo 'x32'
elif [[ "$arch" = arm* ]]; then
    echo 'a32'
elif test "$arch" = aarch64; then
    echo 'a64'
else
    exit 1
fi

ответ Джатина Мехротры на повторяющийся вопрос подробно описывает, как получить конкретный процессор вместо архитектуры. Использование sysctl -n machdep.cpu.brand_string выводит Apple M1 на моем M1 Mac Mini, однако на сервере Raspberry Pi 4 Ubuntu выводит следующее:

> sysctl -n machdep.cpu.brand_string
Command 'sysctl' is available in the following places
 * /sbin/sysctl
 * /usr/sbin/sysctl
The command could not be located because '/sbin:/usr/sbin' is not included in the PATH environment variable.
This is most likely caused by the lack of administrative privileges associated with your user account.
sysctl: command not found

> sudo sysctl -n machdep.cpu.brand_string
sysctl: cannot stat /proc/sys/machdep/cpu/brand_string: No such file or directory

Если uname -m возвращается x86_64, я думаю, вы, вероятно, используете свой терминал через Rosetta. Вы проверили Open using Rosetta в диалоговом окне Get Info для терминальной программы?

Klas Mellbourn 27.06.2021 12:28
Open using Rosetta снят флажок: dropbox.com/s/lrhxgkxtmi2wv74/… Если я запускаю новую команду /bin/bash -i, а затем запускаю uname -m, она возвращает arm64, а uname -p возвращает arm. Это вызвано тем, что моя оболочка по умолчанию, установленная доморощенным, запускается через rosetta. Спасибо, что помогли мне отследить это. Я обновил свой ответ.
balupton 28.06.2021 00:38

Я обнаружил, что sysctl -n machdep.cpu.brand_string сообщил Apple M1, хотя процесс выполнялся под управлением Rosetta.

Обновление: будьте готовы к Apple M1 Pro, Apple M2, Apple M2 Max и т. д.!

Это то, что нужно, чтобы четко ответить «могу ли я arch -arm64 bash выбраться отсюда». Трудно поверить, что у arch нет -l списка доступных архитектур машин.

Joe 06.12.2021 05:45

должен быть принятым ответом, за исключением того факта, что это не работает в Linux

airtonix 25.07.2022 08:28

Будьте осторожны, чтобы не сделать точное совпадение. Мой ноутбук возвращается Apple M1 Pro.

Mark 26.08.2022 20:24

MacBook Pro 16 дюймов 2023 года (с процессором M2 Max) ответит Apple M2 Max

Klas Mellbourn 14.04.2023 17:08

Другие вопросы по теме