2011-08-17 19:36:41 +0000 2011-08-17 19:36:41 +0000
86
86

¿Cómo debo configurar la variable PATH en mi Mac para que se encuentren las herramientas instaladas por Hombrew?

Intentando instalar Homebrew en un nuevo Mac (en los Macs anteriores instalaba los paquetes desde el código fuente).

El primer paquete que intenté instalar fue Git:

$ brew install git

La instalación fue bien, pero en which git sigue apareciendo el de /usr/bin/git que venía con Lion (¿creo?). Y no el de /usr/local/bin/git que se acaba de instalar. Como puedes ver, /usr/bin aparece por defecto antes que /usr/local/bin en el $PATH

Así que, ¡estoy confundido! Pensé que el punto de HomeBrew (y algo de lo que los creadores parecen presumir) era que no tienes que meterte con la variable $PATH!?

Entonces, ¿qué he hecho mal?

Respuestas (9)

79
79
79
2013-01-13 22:35:02 +0000

Encontré este post relacionado que es muy útil. En lugar de cambiar la variable $PATH, simplemente te hace editar tu archivo /etc/paths. Homebrew quiere que modifique mi PATH; ni idea de cómo

En cuanto seguí las instrucciones y puse /usr/local/bin encima de /usr/bin, mis problemas se resolvieron.

  1. En OS X, abre el Terminal
  2. Escribe el comando sudo vi /etc/paths
  3. Introduce tu contraseña si te la piden
  4. Verás una lista de rutas. Edítalas de forma que la ruta /usr/local/bin se introduzca por encima de la ruta
  5. *Guardar y salir
  6. Reinicie el Terminal

Este es el aspecto que tiene el mío después de hacer esto:

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

*Para guardar y salir escribe dos puntos (/usr/bin), luego escribe : (para escribir y salir al mismo tiempo), seguido de Enter.

También puede abrir el archivo wq en un editor de texto gráfico y editarlo de esa manera.

Crédito a fengd en Stack Overflow por su respuesta allí.

29
29
29
2013-04-09 23:28:21 +0000

Esta respuesta es obsoleta. La ordenación preferida de Homebrew PATH solía ser la explicada, pero ya no es así. Sin embargo, el enfoque es más aplicable en general, así que por el interés, lo dejo.

  • *

No debería.

Homebrew mantiene intencionadamente /usr/local/bin después de /usr/bin en la ruta para una máxima compatibilidad. Invertir el orden de estos directorios en PATH editando /etc/paths significaría que todos los programas en cualquier parte del sistema, sin importar cómo se hayan iniciado, obtendrán la versión Homebrew de un comando. Pero algunos pueden esperar específicamente la versión de Apple, o simplemente no poder usar una versión más nueva, etc.

¿Cómo conservar este principio y seguir obteniendo la versión de Homebrew instalada de git? Como dice el refrán, todos los problemas se pueden resolver con una capa de indirección (excepto tener demasiadas capas de indirección). - O en este caso, como resulta, dos capas.

Específicamente, ha sido parte de mis hábitos en Unix tener un directorio ~/bin que pongo al comienzo de mi PATH. Este es uno de los primeros bits de mi .bashrc:

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

Esto comprueba si el PATH contiene ~/bin, y si no, lo antepone. Con esto en su lugar, entonces hacer selectivamente que sólo el git gestionado por Homebrew tenga prioridad sobre la versión del sistema (en lugar de todos los binarios gestionados por Homebrew), y sólo para sus sesiones de shell (en lugar de todos los programas iniciados desde cualquier lugar, incluyendo los programas de la GUI), es tan simple como enlazarlo:

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

Usted podría hacer un enlace simbólico a /usr/local/Cellar/git/1.8.2.1/bin/git directamente, pero entonces tendría que arreglar su enlace simbólico cada vez que hiciera un brew upgrade git (directa o indirectamente). Al enlazar con el symlink de ubicación fija de Homebrew, no tienes que preocuparte por ello.

Así que añades un directorio a tu $HOME para que puedas añadirlo a tu PATH para que puedas hacer un enlace simbólico a un enlace simbólico, y eso arregla tu problema y pone una sonrisa en el Dr. Seuss. Yo dawg I herd you like symlinks so we put a path in your PATH so you can symlink while you symlink.

18
18
18
2011-08-17 19:42:55 +0000

No has hecho nada malo, pero parece bastante claro que si tuvieras /usr/local/bin en tu ruta antes de /usr/bin este problema específico desaparecería. La solución más fácil es hacer eso y poner algo como

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

en tu ~/.bash_profile para que todo lo que instale Homebrew se encuentre primero. Así es como lo tengo configurado en mi Mac, y me ha funcionado durante todo este tiempo, sin embargo, YMMV.

Parece que ellos creen que funcionaría con /usr/local/bin estando después de /usr/bin, así que aunque puede que yo haya estropeado mi propio $PATH, puedo ver donde falta su documentación:

Tenga en cuenta que debe poner /usr/local/bin después de /usr/bin porque algunos programas esperarán obtener la versión del sistema de, por ejemplo, ruby, y se romperán si obtienen la versión más reciente de Homebrew.

De Discrepancia entre wiki & brew doctor #10738 .  Tenga en cuenta que este documento continúa diciendo, “El FAQ (la cita anterior) se refiere a la configuración de PATH para aplicaciones GUI; el doctor (el consejo de poner /usr/local/bin por delante de /usr/bin en su PATH) se refiere a la configuración de PATH para aplicaciones CLI”.

6
6
6
2013-04-03 19:28:03 +0000

No estoy de acuerdo con la respuesta de jthomas. Editar tu archivo /etc/paths cambiará las rutas de carga de todos los programas. Esto podría ser peligroso si una aplicación del sistema espera encontrar una versión específica de un binario pero encuentra una versión diferente porque usted ha editado su archivo de rutas. En su lugar, cambie su variable de ruta en ~/.bashrc (o ~/.bash_profile). Entonces su ruta de carga sólo cambiará dentro de la terminal:

Añade la aplicación homebrew al PATH

export PATH=/ruta/al/homebrew/app/bin:$PATH

Luego recarga bash o source ~/.bashrc, y ya está. Como la ruta de homebrew viene antes que cualquier otra cosa, bash cargará la versión que descargaste con homebrew.

5
5
5
2014-01-03 22:07:43 +0000

Según tengo entendido, brew no pone nada en /usr/local/bin que colisione (tenga el mismo nombre que) un ejecutable distribuido por Apple. Por lo tanto, tener /usr/local/bin en la ruta antes de /bin y /usr/bin no debería ser un problema, porque no debería haber colisiones de nombres. *Sin embargo, vea los problemas con ls y tar, y el uso de otros agregadores de paquetes como fink y port (MacPorts), más abajo.

Brew hace una de las dos cosas que conozco que ayudan a gestionar las colisiones de nombres:

  1. Brew deja los barriles sin enlazar en la bodega. Para instalar cosas, brew deja las herramientas donde están, y crea enlaces simbólicos a esas herramientas en /usr/local/bin. Para las herramientas con las que brew no quiere una colisión de nombres, no crea un enlace simbólico.
  2. Para muchas, si no todas, las herramientas estándar que también están en /bin y /usr/bin, brew prefija el enlace en /usr/local/bin con una “g”, por lo que, por ejemplo, para realizar un ls con una versión de cerveza, utilice gls. Simplemente haga un ls -l en /usr/local/bin y busque los archivos enlazados - esos son los que brew puso allí. Nota: Las herramientas instaladas en brew a las que hay que acceder por su nombre real se encuentran en /usr/local/Cellar/coreutils/8.21/libexec/gnubin.

No pongo /usr/local/bin en mi ruta por dos razones - esas razones están al final de mi respuesta.

Para evaluar las colisiones de nombres en su sistema, use brew doctor y busque esta sección - Aquí está la salida de interés de brew doctor:

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 razón por la que no pongo las herramientas de brew en primer lugar, de hecho, no en absoluto, es porque los comandos brew instalados ls y tar no manejan la ACL del sistema de archivos correctamente, de hecho, la última vez que lo comprobé (que fue la semana pasada), no se manejaban en absoluto. Este es un GRAN problema, y para evitarlo por completo, junto con el problema asociado de configuración de la página man que acompaña a la configuración del $PATH correctamente, me aseguro de poner primero las herramientas relacionadas con el OSX, especialmente las que se encuentran en el /bin y el /usr/bin.

Otra razón por la que ni siquiera pongo /usr/local/bin en mi ruta es porque brew no juega bien con otros, y fink y port (MacPorts) tienen mucho más paquetes soportados en la actualidad que los que necesito NOW. Por ejemplo, puedo conseguir gnome-terminal con fink, pero sería un gran esfuerzo construir una fórmula y hacer lo mismo con brew. Así que guardo /sw y /opt en mi búsqueda $PATH (para fink y port, respectivamente) y hago referencia a las cosas que necesito de /usr/local/bin, incluyendo gnat, ya sea deletreado, o utilizo bash alias‘s, o me abro un archivo setup para un entorno completamente diferente cuando escribo código Ada.

La cosa es que realmente depende de lo que quieras y necesites en ese momento.

Aquí hay un ejemplo del problema de ACL que mencioné antes.

Con las herramientas estándar de OSX:

$ /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

y con las herramientas instaladas de brew:

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

y

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

Obtendrás resultados similares con tar y no conozco el hogar de muchas otras herramientas de brew, ¡pero quién puede permitirse que algo se rompa 6 meses después por un problema de ACL!

4
4
4
2014-09-18 20:46:55 +0000

Hay un montón de buenas respuestas aquí. Aquí está la mía:

echo >> ~/.bashrc alias my="PATH=/usr/local/bin:$PATH"
. ~/.bashrc
my git --version # Brew's fancy git
git --version # Apple's old crusty git

Te ahorra tener que crear un alias separado para cada programa, y como extra deja las instalaciones por defecto accesibles en caso de que las necesites.

Funciona igual si estás usando ZSH; sólo cambia bashrc por zshrc. Puedes cambiar my por _ o incluso @ para ahorrarte el tecleo.

2
2
2
2013-07-30 18:47:40 +0000

En lugar de jugar con el PATH en absoluto (que en mi historia vuelve a quemarme meses después) añadí un alias para git en mi directorio de alias personalizados de zsh (~/.zshrc/custom/git_alias.zsh).

alias git='/usr/local/bin/git'

0
0
0
2017-05-23 17:29:13 +0000

Puede emitir el siguiente comando en un terminal, que añadirá el directorio principal de brew + el /bin en el PATH de su archivo init “rc” de SHELL (bash, zsh, csh)

echo "export PATH="'$PATH:$(brew --prefix)/bin' >> ~/.$(basename $SHELL)rc

¡Disfrute!

0
0
0
2014-03-21 11:54:36 +0000

Prefiero limitar los cambios en las variables environvent como $PATH a los usuarios que realmente quieren el cambio. Así, simplemente añado lo siguiente a ~/.bashrc:

export PATH="$(brew --prefix)/bin:$PATH"