¿Qué es la RUTA en un Mac OS?

12

¿Qué es el PATHen 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 PATHy cuál es la diferencia entre /etc/pathsy ~/.bash_profile**?

Por ejemplo, en mi pathsarchivo, 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 pathsarchivo? ¿Qué es todo eso en paths, como /usr/bin?

gwg
fuente
2
No combine varias preguntas en una sola publicación. Cada una de sus preguntas sería bienvenida aquí por separado, pero no todas juntas de esta manera. Reduzca esto a una sola pregunta, podría combinar 1 y 2, pero los otros no tienen nada que ver específicamente con PATH. 3 se responde aquí 4 se explica aquí y 5 no tiene mucho sentido, me temo. Tampoco su pregunta extra, ¿qué archivos son binarios? Los guiones no lo son.
terdon
He editado mi pregunta abajo. Además, encontré útiles esos enlaces. Gracias.
gwg

Respuestas:

15

1. ¿Cuál es el propósito de PATH?

PATHes 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 su jsdocejemplo). Por lo tanto, si PATHtiene

/usr/bin:/bin:/home/bin

entonces 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/pathsse usa para establecer PATHglobalmente (es decir, en todo el sistema, para todos los usuarios) mientras ~/.bash_profilese usa para establecer las preferencias por usuario (donde ~estará el directorio de inicio del usuario). ¿Qué está escrito en la .bash_profilelata o bien añadir a lo global PATHdesde /etc/pathso anular por completo.

Para el registro, /etc/pathsparece ser una peculiaridad de MAC OS: al menos no lo he encontrado en GNU / Linux.

Joseph R.
fuente
Acabo de editarlos, ¡pero gracias por responderlos a todos!
gwg
@ggundersen Recorté mi respuesta para que se ajustara a tu pregunta editada.
Joseph R.
@ggundersen, es posible que también desee leer mi respuesta y los enlaces que contiene sobre /etc/pathsOSX.
terdon
7

¿Cuál es el propósito de PATH?

Así es como su shell encuentra programas. Cuando escribe ls, por ejemplo, está ejecutando un programa llamado lsque vive en la /binmayoría de los sistemas, incluido Mac OS X. Su shell solo puede encontrar eso porque /binestá en el PATH.

El shell busca programas en PATHorden, de izquierda a derecha. Si hay dos lsprogramas en su sistema, y ​​sus directorios están en su PATH, encontrará el que está en el directorio que aparece primero en su PATH.

¿Cuál es la diferencia entre / etc / paths y ~ / .bash_profile

Las rutas configuradas /etc/pathsse agregan al PATHinicio en todos los shells en Mac OS X.

~/.bash_profilees 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ía tcshy zsh, por ejemplo, los cambios realizados para /etc/bashrcque no se apliquen a su nuevo shell.

Además, /etc/pathses un archivo de configuración de nivel de sistema, mientras que ~/.bash_profilees por usuario. Si tenía múltiples usuarios interactivos configurados en su Mac, no querría agregar directorios a los /etc/pathsque no desea que aparezcan en todos PATH. Lo mismo es cierto /etc/bashrc, excepto que, por supuesto, eso solo se aplica a los usuarios que usan Bash como su shell.

¿Cuál es la diferencia entre PATH y $ PATH y $ {PATH}?

Por lo general, solo ve la variable sin el sigilo cuando configura la variable. FOO=barestablece la FOOvariable de entorno en la cadena bar. Si escribe set, el shell muestra todas las variables de entorno, y en ese caso también verá la variable sin ningún sigilo.

$PATHy ${PATH}generalmente son intercambiables. Le dicen al shell que expanda el PATHvalor de la variable actual en el lugar. La diferencia tiene que ver con cómo y dónde los usa. Por ejemplo:

$ FOO=bar
$ echo $FOO
bar
$ echo $FOOx

$ echo ${FOO}x
barx

En el segundo echocomando, el shell no imprime nada porque le pide que imprima una variable llamada FOOx, que no existe; el shell trata las variables inexistentes como vacías. Debido a que el tercero echousa la sintaxis de llaves, permite que el shell vea que está solicitando la FOOvariable y que xes solo otro carácter que desea imprimir inmediatamente después.

Hay otra forma de obtener el mismo efecto sin llaves, por cierto:

$ echo "$FOO"x
barx

Las variables de entorno se expanden entre comillas dobles, y las comillas separan la xexpansión de la variable para que el shell haga lo correcto.

Estoy usando la FOOvariable de entorno aquí solo por claridad. Todo lo que he escrito anteriormente también se aplica PATH, ya que es solo otra variable de entorno. Los textos de ejemplo serían mucho más largos.

¿Qué significa export PATH? ¿Cuándo exportamos?

Tomando el FOOejemplo anterior , si tuviera que ejecutar otro programa, no vería la FOOvariable porque no se exporta. Vive solo dentro de esa instancia de shell:

$ echo $FOO
bar
$ bash
$ echo $FOO

$ exit
$ export FOO
$ bash
$ echo $FOO
bar

Cuando ejecuto por primera vez un nuevo bashshell bajo el que ya estaba usando, luego trato de mostrar el valor de FOO, obtengo un espacio en blanco porque FOOno se exportó para que lo vean los subprogramas. Luego salí de la segunda bashinstancia, la exporté, corrí bashnuevamente, y ahora la segunda instancia ve el valor de FOO.

Lo usa exportcuando 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.

Warren Young
fuente