Arm64 Mac: как организовать две среды оболочки (с Rosetta и без нее)

Я использую MacBook Air M1 для программирования. Существует множество инструментов, которым требуется эмуляция Rosetta, в то время как другие изначально работают намного быстрее и стабильнее.
Чтобы справиться с этим, я создал копию терминала, назвал ее «Терминал Rosetta» и включил флажок «Открыть с помощью Rosetta».

Но проблема, с которой я столкнулся, заключается в том, что между этими терминалами используется много настроек. Например, есть некоторые библиотеки Python, которые не работают под Arm64. Итак, я установил conda с помощью установщика x64 в терминал Rosetta. Но в родном терминале теперь также есть среда conda, и я ничего там не устанавливал. И я могу использовать conda для активации сред, которые определенно не будут работать без эмуляции Rosetta.

До сих пор я использовал домашнее пиво только в терминале Rosetta. Но теперь есть несколько пакетов, которые я хотел бы установить в собственный терминал. Мне понадобятся две доморощенные среды параллельно.

Я думаю, что правильный способ решить эту проблему — создать два отдельных профиля zsh и сохранить отдельные переменные PATH для двух терминалов. Но я не понимаю, как это можно настроить. Возможно, было бы полезно использовать что-то другое, кроме терминала по умолчанию.

2 ответа

Если вы открываете Терминал на своем M1/Apple-Silion Mac и вводитеuname -mp, вы получите что-то вроде:

      arm64 arm

Если вы откроете Терминал с помощью Rosetta и запустите его, вы получите:

      x86_64 i386

Вы можете использовать эту команду (или даже один из вариантов «-m» или «-p») с логикой IF/THEN в сценарии профиля вашей оболочки, чтобы изменить PATH и т. д. в зависимости от того, в какой среде вы находитесь.

Комментарии @jimtut оказались очень полезными (большое спасибо!).

Если вы ищете, как иметь ветки в конфигурации вашей оболочки, вот код, который вы можете поместить в.zprofile:

      #!/bin/zsh
 
arch_name="$(uname -m)"
 
if [ "${arch_name}" = "x86_64" ]; then
    if [ "$(sysctl -in sysctl.proc_translated)" = "1" ]; then
        echo "Running on Rosetta 2"
    else
        echo "Running on native Intel"
    fi 
elif [ "${arch_name}" = "arm64" ]; then
    echo "Running on ARM"
    eval "$(/opt/homebrew/bin/brew shellenv)"
else
    echo "Unknown architecture: ${arch_name}"
fi

Если вы заинтересованы в наличии двух отдельных установок для домашнего пивоварения, вам следует сделать следующее:

  • запустите их установщик дважды: один раз в терминале Rosetta 2, один раз в собственном терминале
  • два запуска создадут два установочных каталога. Бинарные файлы x86 теперь находятся в /usr/local, а файлы Arm — в /opt/homebrew.
  • насколько я вижу, двоичные файлы Intel по умолчанию находятся в PATH. Но вы можете активировать ручные, чтобы они имели приоритет. Поэтому я добавил следующую строку в свой .zprofile, она выполняется, когда терминал работает на руке.eval "$(/opt/homebrew/bin/brew shellenv)"

Теперь у вас есть две версии Brew, и в зависимости от того, эмулируется ли ваша оболочка или встроена, правильная версия находится в вашем PATH.

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