¿Qué es el PATH
en un Mac OS? Lo he usado para instalar herramientas globales de línea de comandos, pero la única documentación que he encontrado son tutoriales para hacer precisamente eso, sin una explicación real de lo que sucede debajo del capó. Tampoco he encontrado una página relevante en Wikipedia .
Entonces, ¿cuál es el propósito PATH
y cuál es la diferencia entre /etc/paths
y ~/.bash_profile
**?
Por ejemplo, en mi paths
archivo, veo esto:
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
Pero en mi ~/.bash_profile
, veo esto:
# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH
¿Es esto solo una adición específica del usuario al paths
archivo? ¿Qué es todo eso en paths
, como /usr/bin
?
Respuestas:
1. ¿Cuál es el propósito de PATH?
PATH
es una variable de entorno que contiene una lista de directorios separados por dos puntos donde su shell buscará los ejecutables que nombre en la línea de comandos sin proporcionarles una ruta explícita (como en sujsdoc
ejemplo). Por lo tanto, siPATH
tieneentonces se buscará cualquier ejecutable que llame por nombre en estos directorios (en ese orden) y el primer ejecutable encontrado es el ejecutado.
2. ¿Cuál es la diferencia entre / etc / paths y ~ / .bash_profile
De acuerdo con esta pregunta en ServerFault ,
/etc/paths
se usa para establecerPATH
globalmente (es decir, en todo el sistema, para todos los usuarios) mientras~/.bash_profile
se usa para establecer las preferencias por usuario (donde~
estará el directorio de inicio del usuario). ¿Qué está escrito en la.bash_profile
lata o bien añadir a lo globalPATH
desde/etc/paths
o anular por completo.Para el registro,
/etc/paths
parece ser una peculiaridad de MAC OS: al menos no lo he encontrado en GNU / Linux.fuente
/etc/paths
OSX.Así es como su shell encuentra programas. Cuando escribe
ls
, por ejemplo, está ejecutando un programa llamadols
que vive en la/bin
mayoría de los sistemas, incluido Mac OS X. Su shell solo puede encontrar eso porque/bin
está en elPATH
.El shell busca programas en
PATH
orden, de izquierda a derecha. Si hay dosls
programas en su sistema, y sus directorios están en suPATH
, encontrará el que está en el directorio que aparece primero en suPATH
.Las rutas configuradas
/etc/paths
se agregan alPATH
inicio en todos los shells en Mac OS X.~/.bash_profile
es solo uno de varios scripts de shell ejecutados por Bash al inicio, y varios de ellos son específicos de Bash. Por lo tanto, si cambia su shell, Mac OS X también se envíatcsh
yzsh
, por ejemplo, los cambios realizados para/etc/bashrc
que no se apliquen a su nuevo shell.Además,
/etc/paths
es un archivo de configuración de nivel de sistema, mientras que~/.bash_profile
es por usuario. Si tenía múltiples usuarios interactivos configurados en su Mac, no querría agregar directorios a los/etc/paths
que no desea que aparezcan en todosPATH
. Lo mismo es cierto/etc/bashrc
, excepto que, por supuesto, eso solo se aplica a los usuarios que usan Bash como su shell.Por lo general, solo ve la variable sin el sigilo cuando configura la variable.
FOO=bar
establece laFOO
variable de entorno en la cadenabar
. Si escribeset
, el shell muestra todas las variables de entorno, y en ese caso también verá la variable sin ningún sigilo.$PATH
y${PATH}
generalmente son intercambiables. Le dicen al shell que expanda elPATH
valor de la variable actual en el lugar. La diferencia tiene que ver con cómo y dónde los usa. Por ejemplo:En el segundo
echo
comando, el shell no imprime nada porque le pide que imprima una variable llamadaFOOx
, que no existe; el shell trata las variables inexistentes como vacías. Debido a que el terceroecho
usa la sintaxis de llaves, permite que el shell vea que está solicitando laFOO
variable y quex
es solo otro carácter que desea imprimir inmediatamente después.Hay otra forma de obtener el mismo efecto sin llaves, por cierto:
Las variables de entorno se expanden entre comillas dobles, y las comillas separan la
x
expansión de la variable para que el shell haga lo correcto.Estoy usando la
FOO
variable de entorno aquí solo por claridad. Todo lo que he escrito anteriormente también se aplicaPATH
, ya que es solo otra variable de entorno. Los textos de ejemplo serían mucho más largos.Tomando el
FOO
ejemplo anterior , si tuviera que ejecutar otro programa, no vería laFOO
variable porque no se exporta. Vive solo dentro de esa instancia de shell:Cuando ejecuto por primera vez un nuevo
bash
shell bajo el que ya estaba usando, luego trato de mostrar el valor deFOO
, obtengo un espacio en blanco porqueFOO
no se exportó para que lo vean los subprogramas. Luego salí de la segundabash
instancia, la exporté, corríbash
nuevamente, y ahora la segunda instancia ve el valor deFOO
.Lo usa
export
cuando desea que los subprogramas vean los valores establecidos en el shell, y no lo usa cuando no desea que eso suceda.Normalmente, no exporto variables temporales en scripts de shell, porque no quiero que cambien la forma en que se ejecutan los programas desde ese script de shell.
No voy a responder ninguna de tus otras preguntas. Se supone que solo debes hacer una pregunta a la vez. Solo he respondido esto porque están vagamente relacionados. Todo lo demás pertenece a una pregunta separada.
fuente