zsh: 可执行文件中的CPU类型不正确

我正在使用一台搭载 Apple M1 芯片的 MacBook,在终端上进行操作。我尝试使用一个不适用于 aarm64 架构的命令行工具,所以在终端中出现了以下错误信息:

zsh: bad CPU type in executable
有什么办法可以使用这个命令行工具,比如模拟或其他方式?我该如何在基于 M1 芯片的 Mac 上,在终端中运行非原生 Arm 架构的二进制文件?
3个回答

当macOS尝试运行一个不适用于苹果芯片的应用程序时,macOS会提示安装Rosetta 2来自动将该应用程序翻译为苹果芯片。 在终端中,没有自动检测缺少Rosetta以运行旧架构的命令行工具。 如果您还没有收到其他应用程序的提示,请手动安装Rosetta 2
softwareupdate --install-rosetta
如果您需要在以前的架构中运行通用二进制文件,请使用arch并指定架构。对于需要运行不适用于苹果芯片的其他二进制文件(如Homebrew)的二进制文件,您需要手动指定架构。
arch -x86_64 …
例如,arch -x86_64 brew install packagename 或者,您可以通过在Finder中打开终端应用程序的“获取信息”并勾选“使用Rosetta打开”来运行整个终端应用程序。这种方式将使用Rosetta运行终端和其尝试运行的所有二进制文件,因此不支持Apple芯片的二进制文件,并且性能会受到影响,但您无需指定架构即可运行旧的二进制文件。 要将现有的zsh终端切换到x86_64,请使用以下命令:
arch -x86_64 zsh

在Linux中没有类似于binfmt的支持吗? - Dmitry Grigoryev
@DmitryGrigoryev 即使是binfmt也需要处理不同格式的处理程序。安装Rosetta将添加所需的功能,以在M1上运行Intel代码。 - nohillside
@nohillside 当然你需要处理程序,但是binfmt确保检查发生在exec调用中,所以无论你是从GUI、终端、脚本还是其他二进制文件启动一个外部架构的程序都没关系。 - Dmitry Grigoryev
1@DmitryGrigoryev 你为什么认为在 macOS 上工作方式不同(即使内核函数被称为不同)?除非安装了 Rosetta,否则 Big Sur/M1 无法执行 Intel 代码。一旦安装了 Rosetta,操作系统将自动选择正确的二进制文件,可以使用 arch 命令来覆盖其选择(Finder 中的复选框也可以)。 - nohillside
1我在运行命令 arch -x86_64 zsh 时遇到了相同的错误(zsh: bad CPU type in executable)。(我已安装 Rosetta。) - Samet Baskıcı
我刚刚遇到了一个问题,使用asdf而不是nvm。我在两台电脑上都遇到了arch -x86_64 zsh的相同问题,但是arch -x86_64 asdf install nodejs 14.17.4没有问题,顺利运行了。 - erikdstock
有趣的是,对我来说这个方法有效。谢谢 :) - FAHAD SIDDIQUI
2@SametBaskıcı - 你可能想要指定准确的路径来引用你的zsh二进制文件 arch -x86_64 /bin/zsh - amiabl

如果您正在运行: arch -x86_64 zsh (或类似命令)并且出现此错误,请尝试运行
which -a zsh
检查您的zsh安装。我最终得到了
/opt/homebrew/bin/zsh
/bin/zsh

需要的

brew uninstall zsh
只要得到一个,那么对我来说,使用arch命令就可以了。

如果在Mac上安装Homebrew时遇到此错误,请按照以下步骤操作: 1. 打开一个新的终端会话。 2. 通过执行命令PATH=${PATH/\/usr\/local\/bin:},将/usr/local/bin从本次会话的PATH中移除。 3. 在该会话中运行which git curl命令。 4. 确认您没有收到任何错误消息,并且显示的路径都不以/usr/local/bin开头。 5. 在该会话中运行安装程序。 来源:https://github.com/Homebrew/discussions/discussions/1379#discussioncomment-672727

4这个问题是关于错误信息的一般性问题,而不是关于在从Intel迁移的M1安装上安装Homebrew的问题。 - nohillside
如果Homebrew安装出现问题,则按照以下步骤添加详细信息。 - ahmadalibaloch