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

86

Intentando configurar Homebrew en una nueva Mac (en Macs anteriores, instalaría paquetes desde la fuente).

El primer paquete que intenté instalar fue Git:

$ brew install git

La instalación salió bien, pero which gitaún muestra la /usr/bin/gitque vino junto con Lion (¿creo?). Y no el /usr/local/bin/gitque acaba de instalar.

$ 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

Como puede ver los /usr/binvalores predeterminados antes /usr/local/binen$PATH

Entonces, estoy confundido! ¡Pensé que el objetivo de HomeBrew (y algo de lo que los creadores parecen jactarse) era que no tienes que meterte con la $PATHvariable!?!

Entonces, ¿qué hice mal?

Meltemi
fuente
¿Te metiste en tu camino anteriormente y quizás los pusiste en el orden incorrecto? Además, no estoy seguro de por qué este es un "punto de jactancia" de homebrew ... no me gusta el concepto de una ruta o modificarlo, es una cosa compleja que implica crear y rociar 10 listas diferentes en su sistema con permisos especiales o algo así ... ..
prodigitalson
1
ruta, bueno, la parte que no está relacionada con RVM, debería ser un problema estándar. Y no, no me estoy quejando de tener que cambiar el camino. Es solo que parecen repetir la afirmación de If you choose /usr/local, everything 'just works!'que tengo que preguntarme qué me estoy perdiendo ... porque no "solo funciona".
Meltemi

Respuestas:

78

Esta publicación relacionada me pareció muy útil. En lugar de cambiar la $PATHvariable, solo tiene que simplemente editar su /etc/pathsarchivo.

Homebrew quiere que modifique mi RUTA; no tengo idea de cómo

Tan pronto como seguí las instrucciones y puse /usr/local/binarriba /usr/bin, mis problemas se resolvieron.

  1. En OS X, abra Terminal
  2. Escribe el comando: sudo vi /etc/paths
  3. Ingrese su contraseña si se le solicita
  4. Verá una lista de caminos. Edítelos para que la /usr/local/binruta se ingrese sobre la /usr/binruta
  5. *Guardar y Salir
  6. Reiniciar Terminal

Así es como se ve el mío después de que hice eso:

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

* Para guardar y salir, escriba dos puntos ( :), luego escriba wq(para escribir y salir al mismo tiempo), seguido de Enter.

También puede abrir el /etc/pathsarchivo en un editor de texto gráfico y editarlo de esa manera.

Gracias a fengd en Stack Overflow por su respuesta allí.

jthomas
fuente
Para vi dimwits (como yo) use d para cortar una línea yp para pegarla cuando esté en modo comando
Gerard
10
Sería precavido con esto: la mejor respuesta es simplemente modificar la ruta en .profile / .bash_profile y exportarla allí. Al cambiar / etc / caminos, usted (potencialmente) afecta todos los procesos del sistema; cambiar la RUTA en .profile / .bash_profile localiza la preferencia tanto para su cuenta como para los comandos invocados a través del shell de comandos (que, en mi caso para el desarrollo, es lo que quiero). Si eres realmente cauteloso, puedes hacer lo que @Aristotle Pagaltzis sugiere en la respuesta a continuación.
rholmes
1
¿Hay algún punto en el que se detiene para considerar que hay algo terriblemente mal que una instalación simple desde un administrador de paquetes diseñado para OSX está fallando de fábrica? Cambiar su ruta es una "solución" potencialmente inminente y, por cierto, la razón por la que me topé con esta solución propuesta es que brew no puede actualizar mi ruta, pero "rutas" ya está en el orden correcto. Otro callejón sin salida. Paren la locura, arreglen la causa raíz.
Rick O'Shea
Además, hay path_helpery /etc/paths.d.
Simon Wright
29

Esta respuesta es obsoleta. El orden preferido de Homebrew PATHsolía ser como se explicó, pero eso ya no es cierto. Sin embargo, el enfoque es de aplicación más general, por lo que, por el bien del interés, lo dejo.


No deberías

Homebrew mantiene intencionalmente /usr/local/bin después /usr/bin en el camino para una máxima compatibilidad. Invertir el orden de estos directorios PATHmediante la edición /etc/pathssignificaría que todos los programas en cualquier parte del sistema, sin importar cómo se iniciaron, 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 preservar este principio y aún obtener la versión de Homebrew instalada 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 de Unix tener un ~/bindirectorio que puse al comienzo de mi PATH. Este es uno de los primeros bits en mi .bashrc:

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

Esto verifica si PATHcontiene ~/bin, y si no, lo antepone. Con eso en su lugar, hacer que selectivamente solo el Homebrew administrado gittenga prioridad sobre la versión del sistema (en lugar de todos los binarios administrados por Homebrew), y solo para sus sesiones de shell (en lugar de todos los programas iniciados desde cualquier lugar, incluidos los programas GUI), es tan simple como simularlo:

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

Podrías hacer un enlace simbólico /usr/local/Cellar/git/1.8.2.1/bin/gitdirectamente, pero luego tendrías que arreglar tu enlace simbólico cada vez que hagas un brew upgrade git(directa o indirectamente). Al hacer un enlace simbólico al enlace simbólico de ubicación fija de Homebrew, no tiene que preocuparse por ello.

Por lo tanto, agrega un directorio a su $HOMEpara poder agregarlo a PATHfin de que pueda hacer un enlace simbólico a un enlace simbólico, y eso soluciona su problema y sonríe al Dr. Seuss. Yo dawg, te llevo los enlaces simbólicos, así que ponemos una ruta en tu PATHpara que puedas vincular mientras haces un enlace simbólico.

Aristóteles Pagaltzis
fuente
1
Excelente, ¡esto responde exactamente a lo que me preguntaba!
N_A
Esto parece como la respuesta correcta, pero no puedo entender los comandos exactos para ejecutar. Sigo obteniendo "El archivo existe" cuando creo enlaces simbólicos.
Ryan
No hay suficientes detalles para ayudarte, lo siento.
Aristóteles Pagaltzis
1
@Ryan asegúrate de tener el orden de los argumentos directamente en el lncomando. El primer camino es el objetivo, y el segundo es el enlace simbólico
Freedom_Ben
1
Es cierto que, en el cap, fallé con la respuesta obsoleta y logré (uso ZSH) editar el orden de la ruta en .zshrcexport PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
Urs
17

No ha hecho nada malo, pero parece bastante claro que si lo hubiera hecho /usr/local/binantes, /usr/bineste 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 su ~/.bash_profilemodo, todo lo que instala Homebrew se encuentra primero. Así es como lo tengo configurado en mi Mac, y me ha funcionado durante tanto tiempo, sin embargo, YMMV.

Parece que creen que funcionaría con /usr/local/binestar detrás /usr/bin , así que si bien podría haber arruinado el mío $PATH, puedo ver dónde falta su documentación:

Tenga en cuenta que debe colocar /usr/local/bindespués /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 y brew doctor # 10738 . Tenga en cuenta que este documento continúa diciendo: "Las preguntas frecuentes (la cita anterior) se refieren a la configuración de la RUTA para las aplicaciones de GUI; el médico (el consejo para poner /usr/local/binpor delante /usr/bin en su RUTA) se refiere a la configuración de la RUTA para las aplicaciones de CLI".

Nick Klauer
fuente
1
¿No dejará esto dos /usr/local/bins en mi $PATH? Eso creo. Me pregunto si deberíamos editar el orden de las rutas predeterminadas /etc/pathso el contenido de /etc/paths.d? Pero esto afectará a todos los usuarios ... tal vez no sea algo malo. De todos modos, solo quería ver cómo otras personas se han acercado a esto.
Meltemi
@Meltemi, el espíritu de esta respuesta es correcto: actualice su PATH(de la manera que elija) para tener /usr/local/binprioridad /usr/bin. Actualizo mi personalmente PATHen .bash_profilecomo se sugiere aquí.
@ Nick: información interesante ... y solo sirve para confundir los asuntos (al menos mis asuntos) ... los documentos de Homebrew parecen implicar que los comandos de Terminal deberían recoger aplicaciones /usr/local/binaunque se encuentren /usr/binen el camino. ¿Pero las aplicaciones GUI necesitan una codificación especial? Parece que todas las aplicaciones, GUI o no, necesitan que ajustemos la variable $ PATH. Entonces, ¿qué me estoy perdiendo (o los creadores de Homebrew)?
Meltemi
Creo Homebrew supone que desea utilizar el ejecutable de Apple suministradas primera - Git es un cambio ya que hasta León no fue suministrado por Apple tanto necesitaba Homebrew - ahora puede usar la manzana uno,
user151019
Estoy de acuerdo con Mark en esto. Con MacPorts y Fink, la suposición era proporcionar un entorno completamente prístino y separado de todo lo que Apple suministraba de fábrica. Homebrew adoptó la postura de que las cosas de Apple son geniales y no para evitar usarlas (¿por qué descargar otra versión de gcc cuando Apple probablemente lo haga?).
Nick Klauer
6

No estoy de acuerdo con la respuesta de jthomas. La edición de su archivo / etc / paths cambiará las rutas de carga para 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 ha editado su archivo de rutas. En cambio, cambie su variable de ruta en ~ / .bashrc (o ~ / .bash_profile). Entonces su ruta de carga solo cambiará dentro de la terminal:

# Agregue la aplicación homebrew a PATH
export PATH = / path / to / homebrew / app / bin: $ PATH

Luego source ~/.bashrcvuelve a cargar bash o , y listo. Como la ruta homebrew viene antes que nada, bash cargará la versión que descargaste con homebrew.

Nathan
fuente
En OS X, el .bashrcno se carga por defecto. ¿Lo obtienes manualmente?
slhck
Oh si. Vengo de OS X de Ubuntu y estaba acostumbrado a tener un, .bashrcasí que lo obtuve de mi .bash_profile. Si no desea crear el archivo rc, puede agregar el comando a su .bash_profile.
Nathan
5

Según tengo entendido, brewno pone nada en /usr/local/bineso que colisiona (tiene el mismo nombre que) un ejecutable distribuido de Apple. Por lo tanto, tener /usr/local/binen el camino antes /biny /usr/binno debería ser un problema, porque no debería haber colisiones de nombres. * Sin embargo, vea los problemas con lsy tar, y el uso de otros agregadores de paquetes como finky port(MacPorts), a continuación.

Brew hace una de las dos cosas que sé que ayudan a administrar las colisiones de nombres:

  1. Brewdeja barriles desvinculados en la bodega. Para instalar cosas, brew deja las herramientas donde están y crea enlaces simbólicos a esas herramientas /usr/local/bin. Para las herramientas que brewno desean una colisión de nombres, no crea un enlace simbólico.
  2. Para muchas, si no todas, las herramientas estándar que también se encuentran en /biny /usr/bin, brewprefijan el enlace /usr/local/bincon una "g", por ejemplo, para realizar una lsversión en brew, use gls. Basta con hacer una ls -len /usr/local/biny buscar los archivos vinculados - esos son los que brewponen allí. Nota: Las brewherramientas instaladas a las que deben acceder sus nombres reales se encuentran en /usr/local/Cellar/coreutils/8.21/libexec/gnubin.

No pongo /usr/local/binen mi camino por dos razones: esas razones están al final de mi respuesta.

Para evaluar las colisiones de nombres en su sistema, use brew doctory busque esta sección: aquí está el brew doctorresultado de interés:

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 brewlas herramientas primero, de hecho, no es porque los brewinstalados lsy los tarcomandos no manejan el sistema de archivos ACL correctamente, de hecho, la última vez que revisé (que fue la semana pasada), no estaban t manejado en absoluto . Este es un GRAN problema, y ​​para evitarlo por completo, junto con el manproblema de configuración de página asociado que etiqueta junto con la configuración $PATHcorrecta, me aseguro de poner las OSXherramientas relacionadas, especialmente las que se encuentran /biny /usr/bin, primero.

Otra razón por la que ni siquiera pongo /usr/local/binen mi camino es porque brewno juega bien con los demás, finky port(MacPorts) tiene paquetes mucho más compatibles actualmente que los que necesito AHORA . Por ejemplo, yo puedo conseguir gnome-terminalcon fink, pero sería un gran esfuerzo para construir una fórmula y hacer lo mismo con brew. Por lo tanto, mantengo /swy /opten mi búsqueda $PATH(para finky port, respectivamente) y referencias de cosas que necesito /usr/local/bin, incluyendo gnat, deletreado, o uso bash alias's, o obtengo un setuparchivo para un entorno completamente diferente cuando escribo Adacódigo.

La cuestión es que realmente depende de lo que quieras y necesites en ese momento.

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

Con las OSXherramientas estándar :

$ /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 brewherramientas instaladas:

$ /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á resultados similares tary no conozco muchas otras brewherramientas, ¡pero quién puede darse el lujo de que algo se rompa en 6 meses debido a un ACLproblema!

Billy McCloskey
fuente
Gracias por la información útil. Como nota, sin embargo, en mi sistema en este momento, tengo ejecutables con el mismo nombre en / usr / bin y / usr / local / bin (por ejemplo, git, que está enlazado, como usted nota). Entonces, entran en conflicto por defecto. También quiero anular las herramientas del sistema para mi trabajo de shell.
rholmes
4

Hay toda una serie de buenas respuestas aquí. Aquí está el mío:

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

Le ahorra tener que crear un alias separado para cada programa y, como beneficio adicional, deja accesibles las instalaciones predeterminadas en caso de que las necesite.

Funciona igual si está usando ZSH; solo cambia bashrcpor zshrc. Usted puede cambiar hacia fuera mypara _o incluso @para ahorrar en escribir.

Cheezmeister
fuente
2

En lugar de jugar con la RUTA (que en mi historia vuelve a quemarme meses después) agregué un alias para git en mi directorio de alias personalizados zsh (~ / .zshrc / custom / git_alias.zsh).

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

Jesse Smith
fuente
0

Prefiero limitar los cambios a las variables de entorno, como los $PATHusuarios que realmente quieren el cambio. Por lo tanto, simplemente agrego lo siguiente a ~/.bashrc:

export PATH="$(brew --prefix)/bin:$PATH"
Nils Werner
fuente
0

Puede emitir el siguiente comando en una terminal, agregará el directorio de inicio de preparación + el / bin en la RUTA de cualquier archivo de inicio SHELL "rc" (bash, zsh, csh)

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

¡A disfrutar!

vincedgy
fuente