Tratando de configurarcerveza caseraen una Mac nueva (en Mac anteriores instalaría paquetes desde la fuente).
El primer paquete que intenté instalar fue Git:
$ brew install git
La instalación fue bien, pero which git
todavía muestra el que /usr/bin/git
vino junto conLeón(¿Creo?). Y no el que /usr/local/bin/git
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 /usr/bin
los valores predeterminados anteriores /usr/local/bin
en el$PATH
¡Entonces estoy confundido! Pensé que el punto decerveza casera(y algo de lo que los creadores parecen alardear) es que ¡¿no tienes que meterte con la $PATH
variable?!
Entonces, ¿qué hice mal?
Respuesta1
Esta publicación relacionada me pareció muy útil. En lugar de cambiar la $PATH
variable, simplemente edite su /etc/paths
archivo.
Homebrew quiere que modifique mi RUTA; no tengo idea de cómo
Tan pronto como seguí las instrucciones mencionadas /usr/local/bin
arriba /usr/bin
, mis problemas se resolvieron.
- En OS X, abra Terminal
- Escriba el comando:
sudo vi /etc/paths
- Ingresa tu contraseña si te la solicitan
- Verá una lista de rutas. Edítelos para que
/usr/local/bin
la ruta se ingrese encima de la/usr/bin
ruta. - *Guardar y Salir
- Reiniciar terminal
Así es como se ve el mío después de hacer 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 puedes abrir el /etc/paths
archivo en un editor de texto gráfico y editarlo de esa manera.
Crédito afengd Visite Stack Overflow para obtener su respuesta allí.
Respuesta2
Esta respuesta es obsoleta. El orden preferido de Homebrew PATH
solía ser el que se explica, pero eso ya no es cierto. Sin embargo, el enfoque es de aplicación más general, por lo que, en aras del interés, lo dejaré así.
No deberías.
Homebrew mantiene intencionalmente/usr/local/bin
después /usr/bin
en el camino para máxima compatibilidad. Invertir el orden de estos directorios PATH
mediante edición /etc/paths
significaría quetodoLos 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 instalada en Homebrew 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 ~/bin
directorio que coloco al comienzo de mi archivo PATH
. Este es uno de los primeros bits de mi .bashrc
:
[[ :$PATH: == *:$HOME/bin:* ]] || PATH=$HOME/bin:$PATH
Esto comprueba si PATH
contiene ~/bin
y, en caso contrario, lo antepone. Una vez implementado esto, hacer que selectivamente solo la versión administrada por Homebrew git
tenga prioridad sobre la versión del sistema (en lugar decadaBinario administrado por Homebrew), y solo para sus sesiones de shell (en lugar detodoprogramas iniciados desde cualquier lugar, incluidos los programas GUI), es tan simple como vincularlo simbólicamente:
ln -s /usr/local/bin/git ~/bin/git
Túpodríaenlace simbólico /usr/local/Cellar/git/1.8.2.1/bin/git
directamente, pero luego tendría que arreglar su enlace simbólico cada vez que hiciera algo brew upgrade git
(directa o indirectamente). Al establecer un enlace simbólico al enlace simbólico de ubicación fija de Homebrew, no tiene que preocuparse por eso.
Entonces, agrega un directorio a su directorio $HOME
para poder agregarlo PATH
y poder realizar un enlace simbólico a un enlace simbólico, y eso soluciona su problema y le hace sonreír al Dr. Seuss. Amigo, te veo como enlaces simbólicos, así que ponemos una ruta en tu PATH
para que puedas realizar enlaces simbólicos mientras lo haces.
Respuesta3
No ha hecho nada malo, pero parece bastante claro que si se hubiera interpuesto /usr/local/bin
en su camino antes, /usr/bin
este problema específico desaparecería. La solución más sencilla es hacer precisamente eso y poner algo como
export PATH=/usr/local/bin:$PATH
en su ~/.bash_profile
para que todo lo que instala Homebrew se encuentre primero. Así es como lo configuré en mi Mac y, sin embargo, me ha funcionado durante todo este tiempo, YMMV.
Parece que creen que funcionaría /usr/local/bin
siendodespués /usr/bin
, así que, si bien es posible que haya arruinado el mío $PATH
, puedo ver dónde falta su documentación:
Tenga en cuenta que debe ponerlo
/usr/local/bin
después/usr/bin
porque algunos programas esperarán obtener la versión del sistema, por ejemplo, Ruby, y se romperán si obtienen la versión más nueva de Homebrew.
DeDiscrepancia 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 RUTA para aplicaciones GUI; el médico (el consejo que debe anteponerse /usr/local/bin
en /usr/bin
su RUTA) se refiere a la configuración de RUTA para aplicaciones CLI".
Respuesta4
Según tengo entendido, brew
no pone nada /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 /bin
y /usr/bin
no debería ser un problema, porque no debería haber colisiones de nombres. *Sin embargo, consulte 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 sé que ayudan a gestionar las colisiones de nombres:
Brew
deja barriles desvinculados en el sótano. Para instalar cosas, Brew deja las herramientas donde están y crea enlaces simbólicos a esas herramientas en formato/usr/local/bin
. Para las herramientasbrew
con las que no desea una colisión de nombres, no crea un enlace simbólico.- Para muchas, si no todas, las herramientas estándar que también se encuentran en
/bin
y/usr/bin
,brew
anteponen el enlace/usr/local/bin
con una "g", así que, por ejemplo, para realizar unals
versión con preparación, usegls
. Simplemente ingresels -l
y/usr/local/bin
busque los archivos vinculados; esos son los quebrew
se encuentran allí. Nota: Lasbrew
herramientas instaladas a las que se debe acceder por sus nombres reales se encuentran en/usr/local/Cellar/coreutils/8.21/libexec/gnubin
.
No me interpongo /usr/local/bin
en mi camino por dos razones: esas razones se encuentran al final de mi respuesta.
Para evaluar las colisiones de nombres en su sistema, use brew doctor
y busque esta sección: aquí está el brew doctor
resultado 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 brew
las herramientas de primero, de hecho, 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 verifiqué (que fue la semana pasada),no fueron manejados en absoluto. Este es un GRAN problema y, para evitarlo por completo, junto con el man
problema de configuración de la página asociado que se etiqueta junto con la configuración $PATH
correcta, me aseguro de colocar las OSX
herramientas relacionadas, especialmente las que se encuentran en /bin
y /usr/bin
, primero.
Otra razón por la que ni siquiera me interpongo /usr/local/bin
en mi camino es porque brew
no funciona bien con otros y fink
( port
MacPorts) tiene muchos más paquetes compatibles en este momento de los que necesito.AHORA. Por ejemplo, puedo hacerlo gnome-terminal
con fink
, pero sería un gran esfuerzo construir una fórmula y hacer lo mismo con brew
. Por lo tanto, mantengo /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
, incluido gnat
, ya sea escrito en detalle, o uso bash
alias
's, o obtengo un setup
archivo para un entorno completamente diferente cuando escribo Ada
có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 OSX
herramientas 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 brew
herramientas 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 tar
y no conozco muchas otras brew
herramientas, pero ¿quién puede darse el lujo de que algo se rompa 6 meses después debido a un ACL
problema?