Comment remplacer les utilitaires Mac OS X par des utilitaires centraux GNU?

179

J'ai trouvé qu'il y a quelques différences entre la commande d'utilitaire que j'ai utilisée sur Mac OSX et Linux. Je veux faire de mon expérience unie.

Comment pourrais-je remplacer tous mes utilitaires mac par des utilitaires GNU?

steveyang
la source
2
Voici un guide topbug.net/blog/2013/04/14/…
Dennis
16
Je sympathise avec vos frustrations, mais je crois qu’à long terme, leur remplacement rendra plus frustrante - Après avoir essayé de faire la même chose, je vous recommande de l’utiliser homebrewcomme indiqué ci-dessous, puis d’apprendre à utiliser les utilitaires avec un g( gsed, greadlink, etc.) au lieu de remplacer les utilitaires système.
cwd
Pour grep, voir apple.stackexchange.com/questions/193288/…
Dan Pritts le
3
Je ne suis pas d'accord avec @cwd, l'utilisation --with-default-namesn'affecte que l'utilisateur local. Cela pourrait être un problème avec les utilitaires de terminal orientés mac, mais si vous utilisez homebrew pour tout, vous pouvez également prétendre que vous utilisez Linux. Mélangé à iterm2, cela fonctionne très bien pour moi. Je peux fondamentalement prétendre que je suis chez moi avec mes boîtes Linux.
Ray Foss

Réponses:

209

Cela ajoute des liens symboliques pour les utilitaires GNU avec le préfixe g à /usr/local/bin/:

brew install coreutils findutils gnu-tar gnu-sed gawk gnutls gnu-indent gnu-getopt grep

Voir brew search gnupour d'autres forfaits. Si vous souhaitez utiliser les commandes sans préfixe ag, ajoutez par exemple /usr/local/opt/coreutils/libexec/gnubinavant les autres répertoires de votre PATH.

$ brew info coreutils
coreutils: stable 8.21
http://www.gnu.org/software/coreutils
Depends on: xz
/usr/local/Cellar/coreutils/8.20 (208 files, 9.4M)
/usr/local/Cellar/coreutils/8.21 (210 files, 9.6M) *
https://github.com/mxcl/homebrew/commits/master/Library/Formula/coreutils.rb
==> Caveats
All commands have been installed with the prefix 'g'.

If you really need to use these commands with their normal names, you
can add a "gnubin" directory to your PATH from your bashrc like:

    PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

Additionally, you can access their man pages with normal names if you add
the "gnuman" directory to your MANPATH from your bashrc as well:

    MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
Lri
la source
6
FWIW, j'ai une formule Homebrew qui agit comme un méta-paquet pour tous ces grands utilitaires GNU: voir shiny-and-gnu.rbdans github.com/al-the-x/homebrew-mine
AL le X
1
Le premier chemin fonctionne, mais MANPATH a échoué, pourquoi? Est-ce parce que j'utilise OSX10.10? Je me suis fait l'écho de $ MANPATH, et j'ai eu l' /usr/local/opt/coreutils/libexec/gnuman:impression que MANPATH n'était pas inclus. Après avoir commenté la conférence MANPATH dans ma base, je n’ai rien reçu ecoh $MANPATH. Et bien sûr, si j’utilise man pwd, j’ai le manuel BSD. Comment régler ceci?
Zen
2
Pour findutils, vous devez ajouter PATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH"ce qui n’est pas indiqué dans la sortie de la console d’installation.
Sridhar Sarnobat le
1
De plus, pour obtenir la bonne page de manuel findutils, ajoutez ceci à votre$MANPATH /usr/local/opt/findutils/share/man
Christian Long
1
@Zen: la bonne façon d'initier de MANPATHmanière à maintenir la valeur par défaut du système est le suivant : MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". La clé est dans la construction ${var-default_value}.
dan
49

En outre brew install coreutils, vous pouvez également installer d'autres paquets, comme gnu-sed, grep:

brew install findutils
brew install gnu-indent
brew install gnu-sed
brew install gnutls
brew install grep
brew install gnu-tar
brew install gawk

Notez que l' --with-default-namesoption est supprimée depuis janvier 2019, donc chaque fichier binaire doit être ajouté au chemin s'il doit être utilisé sans le gpréfixe.

Ancienne référence (quand --with-default-namesétait disponible): http://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/

Xuhdev
la source
Notez que brew install gawk(contrairement à tous les autres) remplacera awk(via un lien symbolique /usr/local/bin/awk). Si vous voulez conserver l'original /usr/bin/awk, justerm /usr/local/bin/awk
wisbucky
16

Je ne suis pas sûr que je recommanderais de les remplacer ; Cependant, vous pouvez les installer sur un chemin différent et les utiliser de cette façon. Globalement, si vous venez de Linux et que vous souhaitez accéder à des utilitaires plus "génériques" * nix et à un système similaire à apt, je vous conseillerais donc de vous pencher sur Macports: http://www.macports.org

Il permet, par exemple, d'utiliser le dernier "générique" GCC, par opposition à / en plus du GCC inclus d'Apple, juste à titre d'exemple.

Jonathan
la source
3
Par exemple, tar et zip de Mac OS X connaissent des métadonnées, contrairement aux versions GNU.
Lhf
1
Il existe des applications fournies par Apple, qui ne sont que des interfaces graphiques pour certains outils en ligne de commande. Si vous les remplacez, les applications risquent de se comporter de manière étrange.
Ɱark ƭ
Droite; quelque chose comme Macports les ajoute, cela ne les remplace pas.
Jonathan
Si vous souhaitez utiliser les utilitaires GNU par défaut avec MacPorts, vous pouvez ajouter /opt/local/libexec/gnubinà l'avant de votre PATHvariable d'environnement.
markshep
8

J'ai écrit un script pour faire exactement cela! Le script peut être consulté ici (ou ci-dessous). Cependant, je ne peux pas toujours garantir que ce message reflètera la dernière version du script lié précédemment.

Lors de l'exécution du script, Homebrew sera installé (s'il ne l'est pas déjà), tous les utilitaires GNU associés seront installés (si ce n'est déjà fait) et la PATHvariable sera construite à partir des utilitaires installés.

#!/bin/bash

# Install Homebrew (if not already installed)
ruby -e "$(curl -fsSL "\
"https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Install required packages from Homebrew
brew tap homebrew/dupes
brew install coreutils binutils diffutils ed findutils gawk gnu-indent gnu-sed \
  gnu-tar gnu-which gnutls grep gzip screen watch wdiff wget bash gdb gpatch \
  m4 make nano file-formula git less openssh python rsync svn unzip vim \
  --default-names --with-default-names --with-gettext --override-system-vi \
  --override-system-vim --custom-system-icons

# Empty the .bash_path file that holds GNU paths
> ~/.bash_path

# Build PATH variable script in ~/.bash_path
for i in /usr/local/Cellar/*/*/bin; do
  echo 'export PATH="'$i':$PATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/libexec/gnubin; do
  echo 'export PATH="'$i':$PATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/share/man; do
  echo 'export MANPATH="'$i':$MANPATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/libexec/gnuman; do
  echo 'export MANPATH="'$i':$MANPATH"' >> ~/.bash_path
done

# Check if .bash_path is being called from .bash_profile
PATCH=`grep "~/.bash_path" ~/.bash_profile`
if [ "$PATCH" == "" ]; then
  # Add Ubuntu-style PS1 to .bash_profile
  cat <<EOF > ~/.bash_profile
export PS1="\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]# "
EOF
  # Add .bash_path to .bash_profile
  echo "source ~/.bash_path" >> ~/.bash_profile
fi
Clay Freeman
la source
1
N'aimez-vous pas les votes négatifs sans commentaire critique? Merci pour le script.
Justin Force
@JustinForce Pas de problème! Merci pour votre retour.
Clay Freeman
2
-1. Ce script fait trop de magie. Tout le .bash_pathmélange n'est pas vraiment nécessaire si vous suivez les réponses de @ user495470 et @ xuhdev. Et changer de PS1 est complètement hors du champ de cette question.
Greg Dubicki
1
@GregDubicki malheureusement, le chemin bash "mangling" est requis pour certains de ces paquets. Vous pouvez vérifier cela par vous-même. Concernant le changement de PS1: ce script est destiné à un usage personnel. Quiconque souhaite revenir en arrière peut le faire très facilement.
Clay Freeman
5

J'ai écrit un script qui transforme de manière transparente la CLI macOS en une nouvelle expérience de la CLI GNU / Linux en

  • installer les programmes GNU manquants
  • mettre à jour des programmes GNU obsolètes
  • remplacement des programmes BSD préinstallés par leur implémentation GNU préférée
  • installation d'autres programmes communs aux distributions populaires GNU / Linux

https://github.com/fabiomaia/linuxify

git clone https://github.com/fabiomaia/linuxify.git
cd linuxify/
./linuxify install

Il vous permet également de tout annuler facilement.

./linuxify uninstall
fabiomaia
la source
1
Essayer de lancer la première commande ( git clone [email protected].:fabiomaia/linuxify.git) Il a d'abord dit "L'authenticité de l'hôte 'github.com' ne peut pas être établie, etc.". J'ai tapé yeset appuyé sur Entrée. Puis il a dit [email protected]: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.Qu'est-ce qui ne va pas?
izogfif
@izogfif Essayez plutôt le clonage avec HTTPSgit clone https://github.com/fabiomaia/linuxify.git
fabiomaia
1
Oui, ça a marché. Veuillez mettre à jour votre réponse (également, supprimez ces dollars au début - ils sont copiés lorsque vous sélectionnez du texte et copiés-collés dans la console).
izogfif
@izogfif Merci pour les suggestions.
Fabiomaia