arm64 mac:如何保持两个 shell 环境(有和没有 rosetta)的有序性

arm64 mac:如何保持两个 shell 环境(有和没有 rosetta)的有序性

我使用 M1 MacBook Air 进行编程工作。许多工具都需要 Rosetta 模拟,而其他工具则在本机运行速度更快、更稳定。
为了解决这个问题,我设置了一个终端副本,将其命名为“Terminal Rosetta”,并启用了“使用 Rosetta 打开”复选框。

但我面临的一个问题是,这些终端之间共享了许多配置。例如,有些 Python 库在 arm64 下无法工作。因此,我在 rosetta 终端中使用 x64 安装程序安装了 conda。但是本机终端现在也有 conda 环境,而我无需在那里安装任何东西。而且我可以使用 conda 来激活那些没有 rosetta 模拟就肯定无法工作的环境。

到目前为止,我只在 rosetta 终端中使用过 homebrew。但现在我想在本机终端中安装一些软件包。我需要两个并行的 homebrew 环境。

我认为解决这个问题的正确方法是使用两个单独的 zsh 配置文件并为两个终端保留单独的 PATH 变量。但我不明白如何设置它。也许使用默认终端以外的其他终端会有所帮助。

答案1

如果你在 M1/Apple-Silion Mac 上本地打开终端并输入uname -mp,你将获得类似以下内容:

arm64 arm

如果您使用 Rosetta 打开终端并运行它,您将获得:

x86_64 i386

您可以在 shell 配置文件脚本中使用该命令(或者只是其中一个选项“-m”或“-p”)与 IF/THEN 逻辑来更改 PATH 等,具体取决于您所处的环境。

答案2

@jimtut 的评论非常有帮助(非常感谢!)。

如果你正在查找如何在 shell 配置中添加分支,这里有一些你可以输入的代码.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
  • 据我所知,默认情况下,英特尔二进制文件位于 PATH 中。但您可以激活 arm 二进制文件以使其优先。因此,我在 .zprofile 中添加了以下行,当终端在 arm 上运行时,它将执行eval "$(/opt/homebrew/bin/brew shellenv)"

现在您有两个版本的 brew 并且取决于您的 shell 是模拟的还是本机的,正确的版本在您的 PATH 上。

相关内容