Как я могу определить из сценария оболочки, что он работает на оборудовании Apple M1?
Я хочу иметь возможность запускать команду командной строки, чтобы я мог написать if
-оператор, тело которого будет выполняться только при запуске на Mac с процессором M1 (и, по крайней мере, macOS Big Sur, естественно).
да так даже лучше было. Опубликуйте это как ответ, и я приму его
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».
это не только при запуске терминала в Rosetta, но и в том случае, если какой-либо процесс, запускающий сценарий, также выполняется в Rosetta. Если кто-то запустит это в сценарии, развернутом, скажем, RMM, который работает через Rosetta, вы получите x86_64
. я думаю, что подход sysctl
- лучшее решение для поиска «Apple» в строке: [[ $(sysctl -n machdep.cpu.brand_string) =~ "Apple" ]]
Это вообще не работает! Если вы находитесь в ядре VSCode Jupyter, он скажет x86_64, хотя я использую M2 Max. Это sysctl -n machdep.cpu.brand_string
лучшая команда.
@Maziyar «совсем не работает» — это преувеличение. Если ваш «VSCode Jupyter» сообщает x86_64
, то этот процесс выполняется через эмулятор Rosetta, что, вероятно, не то, что вам нужно, поскольку и VSCode, и Jupyter поддерживают Apple Silicon.
с учетом того, что я должен был сказать, ненадежен в зависимости от того, где он выполняется.
При использовании родной оболочки скажите /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
для терминальной программы?
Open using Rosetta
снят флажок: dropbox.com/s/lrhxgkxtmi2wv74/… Если я запускаю новую команду /bin/bash -i
, а затем запускаю uname -m
, она возвращает arm64
, а uname -p
возвращает arm
. Это вызвано тем, что моя оболочка по умолчанию, установленная доморощенным, запускается через rosetta. Спасибо, что помогли мне отследить это. Я обновил свой ответ.
Я обнаружил, что sysctl -n machdep.cpu.brand_string
сообщил Apple M1
, хотя процесс выполнялся под управлением Rosetta.
Обновление: будьте готовы к Apple M1 Pro
, Apple M2
, Apple M2 Max
и т. д.!
Это то, что нужно, чтобы четко ответить «могу ли я arch -arm64 bash
выбраться отсюда». Трудно поверить, что у arch
нет -l
списка доступных архитектур машин.
должен быть принятым ответом, за исключением того факта, что это не работает в Linux
Будьте осторожны, чтобы не сделать точное совпадение. Мой ноутбук возвращается Apple M1 Pro
.
MacBook Pro 16 дюймов 2023 года (с процессором M2 Max) ответит Apple M2 Max
uname -p
, вероятно, даст вам нужную информацию, но у меня нет M1 для тестирования.