37
votes

Détecter le silicium Apple à partir de la ligne de commande

Comment puis-je détecter à partir d'un script shell qu'il fonctionne sur M1 Apple Hardware?

Je veux pouvoir exécuter une commande de ligne de commande afin que je puisse écrire un si -statement dont le corps ne sera exécuté que lors de l'exécution sur un Mac avec un processeur M1 (et au moins macOS Big Sur, naturellement).


3 commentaires

uname -p vous donnera probablement les informations que vous souhaitez, mais je n'ai pas de M1 à tester.


Tested < / a>. Ça marche.


Oui, c'était encore mieux. Publiez-le comme une réponse et je l'accepterai


3 Réponses :


48
votes
if [[ $(arch) == 'arm64' ]]; then
  echo M1
fi

2 commentaires

Notez que les utilisateurs M1 peuvent exécuter le terminal en mode Rosetta. Dans ce cas, "uname -m" renvoie "x86_64".


Ce n'est pas seulement si l'exécution du terminal à Rosetta, mais aussi si n'importe quel processus s'exécute, le script se déroule également dans Rosetta. Si quelqu'un l'exécute dans un script déployé par, disons, un RMM qui s'exécute via Rosetta, vous obtiendrez x86_64 . Je pense que l'approche sysctl est la meilleure solution à la recherche de 'Apple' dans la chaîne: [[$ (sysctl -n machdep.cpu.brand_string) = ~ "Apple"]]



6
votes

Lorsque vous utilisez le shell natif, dites / bin / bash -i ou / bin / zsh -i , Klas Mellbourn Réponse Fonctionne comme prévu.

Si vous utilisez un Shell qui a été installé via une installation Intel / Rosetta Homebrew, puis uname -p renvoie i386 , et uname -m renvoie x86_64 , comme indiqué par datasun Commentaire .


, Linux, Raspberry Pi 4S), j'utilise ce qui suit du écosystème Dorothy dotfile :

xxx Pre>

Si vous n'utilisez pas Dorothy, le code pertinent De Dorothy est:

https: // github. com / bevry / dorothy / blob / 1c747c0fa6bb3e6c18cdc9bae17ab66c0603d788 / commandes / is-mac

> 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

jatin mehrotra Réponse Sur une question en double donne des détails sur la façon d'obtenir le processeur spécifique au lieu de l'architecture. Utilisation de sysctl -n machdep.cpu.brand_string sorties Apple M1 sur mon M1 Mac Mini, mais sort ce qui suit sur un serveur Raspberry Pi 4 Ubuntu:

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


2 commentaires

Si uname -m renvoie x86_64 Je pense que vous exécutez probablement votre terminal via Rosetta. Avez-vous vérifié ouvrir à l'aide de Rosetta dans la boîte de dialogue obtenez des informations pour le programme du terminal?


Ouvrir à l'aide de Rosetta n'est pas cochée: dropbox.com/s/lrhxgkxtmi2wv74/… Si j'en exécute une nouvelle commande / bin / bash -i puis exécuter uname -m puis il renvoie arm64 et uname -p renvoie arm . Il est donc dû à mon coquille par défaut, qui est installé par Homebrew, en cours de Rosetta. Merci de m'avoir aidé à retrouver cela. J'ai mis à jour ma réponse.



14
votes

J'ai trouvé que sysctl -n machdep.cpu.brand_string a rapporté Apple M1 même si le processus était exécuté sous Rosetta.


1 commentaires

C'est ce qui est nécessaire pour répondre proprement 'puis-je arch -arm64 bash mon chemin d'ici. Difficile à croire arch n'a pas de -l pour répertorier les architectures actuelles disponibles.