当前位置: 首页 > 知识库问答 >
问题:

从命令行检测Apple Silicon

上官德寿
2023-03-14

如何从外壳脚本中检测到它在M1 Apple硬件上运行?

我希望能够运行一个命令行命令,这样我就可以编写一个if-语句,它的主体只有在使用M1处理器的mac上运行时才会执行(当然,至少是macOS Big-Sur)。

共有3个答案

狄子真
2023-03-14

当使用原生shell说/bin/bash-i/bin/zsh-i时,Klas Mellbourn的答案按预期工作。

如Datasun的评论所示,如果使用通过Intel/Rosetta自制安装的shell,则uname-p返回i386,而uname-m返回x86_64

为了获得跨环境工作的东西(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

JatinMehrotra对一个重复问题的回答给出了如何获得特定CPU而不是体系结构的详细信息。使用sysctl-n machdep。中央处理器。brand_string在我的M1 Mac Mini上输出苹果M1,但在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
严正初
2023-03-14

我发现了sysctl-n machdep。中央处理器。brand_string报告了苹果M1,尽管该过程是在Rosetta下运行的。

慕容光启
2023-03-14
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
 类似资料:
  • 问题内容: 我希望能够从命令行运行Junit测试,但是当我运行此命令时 我回来的就是 它是否与Android项目有关?我之前已经运行过该命令,并且没有太多问题。 问题答案: 我只是设法从命令行运行JUnit测试,但是使用adb shell。 命令是 更多细节在这里。

  • 问题内容: 我正在寻找一种使用PHP的方法,以检测脚本是从外壳上的手动调用运行的(我登录并运行该脚本),还是从crontab条目运行。 我有各种用php编写的维护类型脚本,这些脚本已设置为在crontab中运行。有时,我需要提前手动运行它们,或者如果发生故障/损坏,则需要运行几次。 这样做的问题是,每次手动运行脚本时,我也不想发生某些任务(发布到Twitter,发送电子邮件等)时需要设置的外部通知

  • 问题内容: 如何从命令行运行Junit 4.8.1测试套件?另外,我想使用JUnit 4.8引入的类别,有没有一种方法可以从命令行指定要运行的类别。 问题答案: 从4.8开始,无法从命令行指定类别。

  • 问题内容: 我目前用于监视Java应用程序的性能指标,并希望 编写 此 数据采集 脚本 。 有没有办法将这些VM指标(堆内存使用率,线程数,CPU使用率等)检索到? 输入的数据并没有完全减少。 谢谢 问题答案: jconsole只是提供了平台MBeanServer中的JMX MBean的包装。 您可以编写一个程序,使用附加API连接到您的VM ,然后再查询MBean。 或者,您可以通过RMI公开平

  • 问题内容: 到目前为止,我主要使用eclipse。现在,我正在尝试从终端运行Java,但程序包存在问题。 这是我的文件: 我使用编译此代码,然后运行,它给我: 当我删除一切正常。我想念什么? 给出: 问题答案: 您需要在一个目录级别上运行java命令,并以完全合格的软件包名称提供它,例如: 请参阅Java Launcher如何查找用户类 以了解其工作方式。

  • 问题内容: 在我们的团队中,我们定义了大多数测试用例,如下所示: 一门“框架”课: 还有很多测试用例,例如testMyCase.py: 当我编写新的测试代码并希望经常运行它并节省时间时,我要做的是在所有其他测试之前放置“ __”。但这很麻烦,使我从正在编写的代码中分散了注意力,并且由此产生的提交噪音实在令人讨厌。 因此,例如,当对进行更改时,我希望能够做到这一点: 并运行 只 我该如何实现? 我尝