104 votes

Comment dois-je définir la variable PATH sur mon Mac pour que les outils installés par Hombrew soient trouvés ?

J'essaie de mettre en place Homebrew sur un nouveau Mac (sur les Macs précédents, j'installais les paquets à partir des sources).

Le premier paquet que j'ai essayé d'installer était Git :

$ brew install git

L'installation s'est bien passée, mais which git montre toujours celui de /usr/bin/git qui est venu avec Lion (je crois ?). Et pas celui de /usr/local/bin/git qui vient d'être installé.

$ echo $PATH
/Users/meltemi/.rvm/gems/ruby-1.9.2-p290@rails31/bin:/Users/meltemi/.rvm/gems/ruby-1.9.2-p290@global/bin:/Users/meltemi/.rvm/rubies/ruby-1.9.2-p290/bin:/Users/michael/.rvm/bin:/usr/local/mysql/bin:/opt/subversion/bin:/Developer/Additions/checker/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

Comme vous pouvez le constater /usr/bin par défaut, avant /usr/local/bin dans le $PATH

Donc, je suis confus ! Je pensais que le but de HomeBrew (et dont les créateurs semblent se vanter), c'est qu'il n'est pas nécessaire de s'occuper de l'interface de l'ordinateur. $PATH variable ! ?!

Alors, qu'est-ce que j'ai fait de mal ?

92voto

jthomas Points 1004

J'ai trouvé ce post connexe très utile. Au lieu de modifier le $PATH il vous suffit de modifier votre /etc/paths fichier.

Homebrew veut que je modifie mon PATH ; je ne sais pas comment faire.

Dès que j'ai suivi les instructions et mis /usr/local/bin au-dessus de /usr/bin mes problèmes ont été résolus.

  1. Sous OS X, ouvrez Terminal
  2. Tapez la commande : sudo vi /etc/paths
  3. Entrez votre mot de passe si on vous le demande.
  4. Vous verrez apparaître une liste de chemins. Modifiez-les de manière à ce que /usr/local/bin est saisi au-dessus du /usr/bin chemin
  5. *Sauvegarder et quitter
  6. Redémarrer le terminal

Voici à quoi ressemble le mien après que j'ai fait ça :

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

*Pour sauvegarder et quitter, tapez deux points ( : ), puis tapez wq (pour écrire et quitter en même temps), suivi de Enter .

Vous pouvez également ouvrir le /etc/paths dans un éditeur de texte graphique et le modifier de cette façon.

Crédit à fengd sur Stack Overflow pour sa réponse.

32voto

Code Bunny Points 101

Cette réponse est obsolète. Le Homebrew préféré PATH L'ordre était autrefois expliqué, mais ce n'est plus le cas. Cependant, l'approche est plus généralement applicable, donc par intérêt, je la laisse en place.


Tu ne devrais pas.

Homebrew garde intentionnellement /usr/local/bin après /usr/bin dans le chemin pour une compatibilité maximale. L'inversion de l'ordre de ces répertoires dans le fichier PATH par l'édition /etc/paths signifierait que todo Les programmes n'importe où sur le système, peu importe comment ils ont été lancés, obtiendront la version Homebrew d'une commande. Mais certains peuvent s'attendre spécifiquement à la version d'Apple, ou simplement ne pas être en mesure d'utiliser une version plus récente, etc.

Comment préserver ce principe et continuer à obtenir la version installée par Homebrew de git ? Comme le dit le proverbe, tous les problèmes peuvent être résolus avec une couche d'indirection (sauf s'il y a trop de couches d'indirection). - Ou dans ce cas, comme il s'avère, deux couches.

Plus précisément, cela fait partie de mes habitudes Unix d'avoir une ~/bin que j'ai placé au début de mon PATH . C'est l'un des premiers éléments de mon .bashrc :

[[ :$PATH: == *:$HOME/bin:* ]] || PATH=$HOME/bin:$PATH

Cela permet de vérifier si PATH contient ~/bin et, dans le cas contraire, le précède. Avec cela en place, puis en faisant sélectivement juste le Homebrew-managed git ont la priorité sur la version système (au lieu de chaque binaire géré par Homebrew), et juste pour vos sessions Shell (au lieu de todo programmes lancés depuis n'importe où, y compris les programmes GUI), est aussi simple qu'un lien symbolique :

ln -s /usr/local/bin/git ~/bin/git

Vous pourrait lien symbolique /usr/local/Cellar/git/1.8.2.1/bin/git directement, mais vous devriez alors corriger votre lien symbolique à chaque fois que vous faites un brew upgrade git (directement ou indirectement). En établissant un lien symbolique vers le lien symbolique à emplacement fixe de Homebrew, vous n'avez pas à vous en soucier.

Vous ajoutez donc un répertoire à votre $HOME afin que vous puissiez l'ajouter à votre PATH afin que vous puissiez établir un lien symbolique vers un lien symbolique, ce qui résout votre problème et donne le sourire au Dr Seuss. Yo dawg je savais que tu aimais les symlinks donc on a mis un chemin dans ton PATH pour que vous puissiez faire des liens symboliques pendant que vous faites des liens symboliques.

19voto

IanMulvany Points 133

Vous n'avez rien fait de mal, mais il semble assez clair que si vous aviez /usr/local/bin sur votre chemin avant /usr/bin ce problème spécifique disparaîtrait. La solution la plus simple est de faire cela et de mettre quelque chose comme

export PATH=/usr/local/bin:$PATH

dans votre ~/.bash_profile pour que tout ce que Homebrew installe soit trouvé en premier. C'est la façon dont je l'ai configuré sur mon Mac, et cela a fonctionné pour moi pendant tout ce temps, cependant, YMMV.

Il semble qu'ils pensent que ça pourrait fonctionner avec /usr/local/bin être après /usr/bin donc, bien que j'aie pu gâcher mon propre $PATH je peux voir les lacunes de leur documentation :

Notez que vous devez mettre /usr/local/bin après /usr/bin car certains programmes s'attendront à obtenir la version système de , par exemple, ruby, et s'arrêteront s'ils obtiennent la version Homebrew plus récente.

De Divergence entre wiki & brew doctor #10738 .  Notez que ce document poursuit en disant , "La FAQ (la citation ci-dessus) fait référence au paramètre PATH pour les applications GUI ; le médecin (le conseil de mettre /usr/local/bin devant /usr/bin dans votre PATH) fait référence au paramètre PATH pour les applications CLI".

7voto

Nathan Points 161

Je ne suis pas d'accord avec la réponse de jthomas. La modification de votre fichier /etc/paths changera les chemins de chargement de tous les programmes. Cela peut être dangereux si une application système s'attend à trouver une version spécifique d'un binaire mais trouve une version différente parce que vous avez modifié votre fichier paths. Au lieu de cela, modifiez votre variable path dans ~/.bashrc (ou ~/.bash_profile). Ainsi, votre chemin de chargement ne changera qu'à l'intérieur du terminal :

# Ajouter l'application homebrew à PATH
export PATH=/path/to/homebrew/app/bin:$PATH

Ensuite, rechargez bash ou source ~/.bashrc et vous êtes prêt à partir. Puisque le chemin homebrew vient avant tout le reste, bash chargera la version que vous avez téléchargée avec homebrew.

4voto

Billy McCloskey Points 1615

Comme je le comprends, brew ne met rien dans /usr/local/bin qui entre en collision (a le même nom que) un exécutable distribué par Apple. Par conséquent, avoir /usr/local/bin dans le chemin avant /bin y /usr/bin ne devrait pas être un problème, car il ne devrait pas y avoir de collision de noms. *Cependant, voir les problèmes avec ls y tar et en utilisant d'autres agrégateurs de paquets comme fink y port (MacPorts), bien en dessous.

Brew fait l'une des deux choses que je connais qui aident à gérer les collisions de noms :

  1. Brew laisse les fûts non reliés dans la cave. Pour installer du matériel, brew laisse les outils là où ils sont, et crée des liens symboliques vers ces outils dans le répertoire /usr/local/bin . Pour les outils qui brew ne veut pas de collision avec un nom, il ne crée pas de lien symbolique.
  2. Pour la plupart, si ce n'est tous les outils standard qui sont également dans /bin y /usr/bin , brew préfixe le lien dans /usr/local/bin avec un "g", donc par exemple, pour effectuer une ls avec une version de brassage, utilisez gls . Il suffit de faire un ls -l en /usr/local/bin et cherchez les fichiers liés - ce sont ceux-là même brew mettre là. Remarque : Le brew Les outils installés auxquels on doit accéder par leur vrai nom se trouvent dans /usr/local/Cellar/coreutils/8.21/libexec/gnubin .

Je ne mets pas /usr/local/bin sur mon chemin pour deux raisons - ces raisons sont au bas de ma réponse.

Pour évaluer les collisions de noms dans votre système, utilisez brew doctor et cherchez cette section - Voici le brew doctor d'intérêt :

Warning: /usr/bin occurs before /usr/local/bin
This means that system-provided programs will be used instead of those
provided by Homebrew. The following tools exist at both paths:

    ctags
    emacs
    emacsclient
    etags
    ex
    git
    git-cvsserver
    git-receive-pack
    git-shell
    git-upload-archive
    git-upload-pack
    rview
    rvim
    view
    vim
    vimdiff
    vimtutor
    xxd

Consider setting your PATH so that /usr/local/bin
occurs before /usr/bin. Here is a one-liner:
    echo export PATH='/usr/local/bin:$PATH' >> ~/.bash_profile

La raison pour laquelle je ne mets pas brew La raison pour laquelle les outils de l'entreprise ne sont pas les premiers, en fait, pas du tout, c'est parce que la brew installé ls y tar ne gèrent pas correctement l'ACL du système de fichiers, en fait, la dernière fois que j'ai vérifié (c'était la semaine dernière), ils n'ont pas été traités du tout . Il s'agit d'un GROS problème, et pour l'éviter complètement, ainsi que les coûts associés, il est nécessaire de mettre en place un système de gestion de la qualité. man Le problème de configuration de la page qui accompagne la mise en place de l $PATH droite, je m'assure que je mets le OSX les outils connexes, notamment ceux qui se trouvent dans /bin y /usr/bin d'abord.

Une autre raison pour laquelle je ne mets même pas /usr/local/bin sur mon chemin, c'est parce que brew ne joue pas bien avec les autres, et fink y port (MacPorts) ont beaucoup plus de paquets supportés actuellement que ce dont j'ai besoin. MAINTENANT . Par exemple, je peux obtenir gnome-terminal con fink mais ce serait un gros effort de construire une formule et de faire de même avec brew . Donc, je garde /sw y /opt dans ma recherche $PATH (pour fink y port respectivement) et faire référence aux éléments dont j'ai besoin dans /usr/local/bin dont gnat soit en toutes lettres, soit en utilisant bash alias ou je crée un setup pour un environnement totalement différent lorsque j'écris Ada code.

Le fait est que cela dépend vraiment de ce que vous voulez et de ce dont vous avez besoin à ce moment-là.

Voici un exemple du problème de l'ACL que j'ai mentionné ci-dessus.

Avec la norme OSX outils :

$ /bin/ls -le /var/root | head -7
total 24
drwx------+  3 root  wheel  102 May 28  2013 Desktop
 0: group:everyone deny delete
 1: user:_spotlight inherited allow list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit
drwx------+  6 root  wheel  204 Sep 19 14:22 Documents
 0: group:everyone deny delete
 1: user:_spotlight inherited allow list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit

et avec le brew outils installés :

$ /usr/local/bin/gls -le /var/root
/usr/local/bin/gls: invalid option -- 'e'
Try '/usr/local/bin/gls --help' for more information.

$ /usr/local/bin/gls --help | grep -i acl

Vous obtiendrez des résultats similaires avec tar et je ne sais pas chez moi combien d'autres brew mais qui peut se permettre de voir quelque chose se briser 6 mois plus tard à cause d'une erreur de manipulation. ACL problème !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X