La variable de entorno PATH en Mac, desmitificada

Todo lo que necesitas saber sobre como configurar la variable de entorno PATH en un Mac.

scroll

¿Qué es PATH?

Cuando en Mac abres un terminal, puedes ejecutar una serie de comandos como ‘pwd‘ -para mostrar la ruta absoluta del directorio en el que te encuentras- o ‘ls‘ -que muestra los ficheros y directorios incluidos en el mismo- independientemente del directorio donde estes y donde se encuentren dichos comandos. Eso es posible gracias a PATH.

PATH es una variable de entorno que permite definir las rutas en las que el sistema operativo buscará esos comandos o ficheros.

El contenido de PATH

Para saber el valor actual de la variable PATH, debemos escribir en el terminal

echo $PATH

El valor de PATH siempre son un conjunto de rutas a directorios o ficheros separados por dos puntos. Por ejemplo, la variable PATH con valor ‘/usr/bin:/bin:/usr/sbin‘  está incluyendo los directorios /usr/bin, /bin y /usr/sbin.

Incluyendo el directorio actual en PATH

Es posible que deseemos modificar el valor de PATH, por ejemplo, [highlight]para incluir el directorio actual[/highlight]. Si no lo hacemos, no podremos ejecutar ningún comando ni abrir ningún fichero del directorio en el que estemos si este no está incluido en PATH.

Por ejemplo, si estamos en el directorio /Users/david/development/Tomcat/bin y, dentro del mismo, existe un fichero ‘startup.sh‘, al intentar ejecutar el comando

startup.sh

obtendremos un error de ‘Fichero no encontrado’ porque el sistema operativo no sabrá donde buscar el fichero ‘startup.sh‘. Por eso debemos indicarle que está en el directorio actual de trabajo, representado por un punto (.)

./startup.sh

Para evitar tener que usar el punto cada vez que queremos trabajar con un fichero de nuestro directorio actual de trabajo, debemos modificar el valor de PATH para que incluya al mismo.

Como modificar el valor de PATH

El valor de PATH, al igual que el de todas las variables de entorno, se modifica con la sintaxis

NOMBRE_DE_VARIABLE=valor

De tal manera que, para modificar la variable PATH para que incluya el directorio actual deberíamos escribir lo siguiente en el terminal

PATH=$PATH:.

Con esto, le hemos dado a PATH el valor actual ($PATH) y, además, la ruta del directorio actual (.), separándola de la anterior con dos puntos (:).

El problema es que, esta configuración se perderá en cuanto cerremos el terminal. Si quieres saber como modificar el valor de PATH de forma persistente, tendrás que aprender como el sistema operativo OS X compone el valor de PATH.

Como se obtiene el valor de PATH en OS X

En OS X, al iniciar una Terminal se ejecuta el archivo /etc/profile. Así, si escribiéramos al final del mismo la famosa linea

PATH=$PATH:.

conseguiríamos añadir el directorio actual al contenido de PATH, pero lo haríamos de una forma poco elegante -porque ese no es el lugar más adecuado para hacerlo- y seguiríamos sin entender como se compone el valor de PATH en OS X.

El mismo fichero /etc/profile lanza un programa de utilidad llamado path_helper. Este programa es el que determina como se compondrá el valor de PATH:

  1. Primero, añade las rutas que encuentra en el fichero /etc/paths. En dicho fichero podrías añadir más rutas, una en cada linea, sin tener que separarlas por (:). Esto modificaría PATH para todos los usuarios del sistema.
  2. Después, carga todas las rutas, una por linea, que encuentre en los ficheros del directorio /etc/paths.d. Este directorio permite configurar PATH modularmente. Así por ejemplo, Atlassian recomienda crearse aquí un fichero llamado ‘atlassian‘ para añadir las rutas de su SDK. Los ficheros se cargan por orden alfabético (se añadirán primero las rutas de ’50-X11’ que de ‘atlassian’). Esta opción, también modifica PATH para todos los usuarios del sistema.
  3. Por último, puedes crear un fichero ].profile en tu directorio HOME -en el que se inicia la terminal- y definir en el mismo el valor de PATH con la sintaxis que ya hemos definido. Esta opción, sólo modifica PATH para el usuario cuyo directorio HOME contenga el fichero .profile [no_highlight background_color=”” color=””]UPDATE (08/JUN/2016): con OS X El Capitán, me ha dejado de funcionar el .profile y he tenido que utilizar el fichero .bash_profile, situado en el mismo directorio[/no_highlight]

Saber como funciona path_helper no solo nos ayudará a configurar el valor de la variable PATH, sino que además nos permitirá conocer porque unos directorios aparecen antes que otros y resolver los conflictos de rutas que podamos tener.

La gestión del directorio actual por comandos que ya están en el PATH

Gracias a la contribución de Dani Lopez, Victor Martinez y David Martinez, completo la información del artículo:

Cuando se usan comandos del tipo open, vi, sh, etc… no es necesario incluir los ficheros del directorio actual en el PATH puesto que estos comandos ya gestionan por si solos esa salvedad.

Es decir, si se ejecuta un open facturas.pdf, el propio comando open intenta abrir el fichero y, si no lo encuentra, vuelve a intentarlo clavándole a fuego un ./ por delante para comprobar si está en el directorio actual.

Bola Extra

  • Daniel López

    Ummm, ¿Estas seguro de que si no incluyes “.” no puedes abrir los ficheros del directorio actual?
    Es decir, en tue ejemplo, el PATH se usa principalmente para encontrar el comando, o sea ‘open’, y luego internamente puede que algun programa use el PATH para buscar cosas, pero no tiene por que.

    Ahora no tengo un Mac para mirar si funciona igual, pero en Linux tu puedes abrir cualquier fichero con el vi, por decir algo, sin tener . en el PATH y sin tener que especificar ./ delante.

    Es decir, el . para el PATH es para poder ejecutar comandos del directorio actual sin tener que escribir ./comando, pero , a no ser cosa interna del comando, a los parametros no les afecta el PATH.

    Quizá sea cosa de Mac…

    PD: Un saludo. ¿Has cruzado el puente de Sydney por encima a patita? Es la típica excursión de turista, pero mola poder decir… “sí, sí, yo lo cruzé por allí” 😀

    • Hola Dani, te confirmo y requeteconfirmo lo puesto en el articulo 🙂

      Puedes poner open sin problemas, porque el directorio /bin donde está el comando SI está en el PATH por defecto, pero como pongas open greeneyed.txt en vez de open ./greeneyed.txt te dice que no te encuentra el fichero (no que no te encuentre el comando).

      Reconozco que me crucé el puente de Sydney… por abajo. No me apetecía especialmente, los compañeros eran un poco gallinaceos y tampoco me motivaron y… 200$ por cruzar el puente. Se han pasado un poco… ^_^

      • Daniel López

        No digo yo que con open no pase, pero la pregunta es… ¿es algo habitual? vi, cat, more, tail, ant, java, tar, jar, gzip… todos esos no necesitan tener el directorio actual en el path para encontrar el fichero que se les pasa como parametro.
        Así que yo más bien diría que lo que pasa es que el comando open es tonto del bote 😀

        PD: No recuerdo yo que costara tanto… aunque ahora que lo dices creo que me lo pagaron… de todas formas… ¿que era eso de invertir en momentos? 😛

        • Olvídate de otros comandos, yo hablo de ruta pura y dura. Por ejemplo, para arrancar el startup.sh que me lanza un Tomcat, sin llamar a un comando que SI este en el PATH y que haga de wrapper para meter el ‘.’ en la ejecución.

          Si tu llamas a startup.sh del tirón en el mismo directorio, sencillamente, no lo encuentra. Evidentemente, pasa lo mismo con cualquier .sh, o con cualquier cosa que intentes lanzar si un comando por delante.

          Respecto a lo del puente de Sydney… me he tirado en paracaídas, he hecho espeleobarranquismo, bungy jumping… de verdad, no me llamaba tanto cruzarme SOLO el puente de Sydney 🙂

          • Daniel López

            No me estás entendiendo o yo no me explico. Por supuesto que necesitas el . en el PATH para ejecutar startup.sh, que es el COMANDO.

            Lo que yo te estoy diciendo es que no es cierto que lo necesites para los PARAMETROS, como dices tú en el post (“open” es el comando, “facturas.pdf” es el parámetro).

            Lo necesitas si el comando es tonto y no usa el directorio de ejecución para buscar un fichero relativo que le hayas pasado como parámetro y en cambio lo busca si está en el PATH, pero de esos solo conozco “open” por que lo has dicho tú.

            Pero hombre, con la emoción que tiene si cae un rayo mientras estás cruzando, jejeje (coñas aparte, cuando lo crucé yo tuvimos que retrasarlo 4 horas por que había tormenta con aparato eléctrico y cruzar un pararayos gigante no es buena idea en esas condiciones 🙂 ). Te toca lo del buceo cuando vengas de visita, ;).

          • Te tomo la palabra con lo del buceo… puede ser el bautismo perfecto 🙂

            Respecto a lo del artículo, lo he modificado y ampliado para añadir esas gotas de sabiduría colectiva que habéis aportado entre todos en los comentarios ^_^

          • Daniel López

            ‘tupendo, solo era para evitar malentendidos. Por cierto que en el feed de JavaHispano salio todo el dia de ayer una crónica australiana que no está en el blog, jejeje, ¿a lo mejor el feed te pilla también los drafts?

            Lo del buceo tranquilo que no sale por 200€, al menos un bautismo (~80€) a no ser que directamente quieras hacer el curso para sacarte la titulación básica, que entonces sí sale por unos ~385€ en un sitio decente y fiable.

  • Muchas gracias David, me ha quedado claro como el agua, didáctico, claro y al grano.

    Bienvenidas todas las guías que desmitifiquen trabajar con Terminal!

    • Jamás podré -ni pretendo- competir con los dioses del Olimpo de la programación, así que, intento que mi valor añadido al escribir algo técnico es que:

      1. Sea útil
      2. No suene como klingon para los no iniciados

      Me alegro de que al menos a una persona le guste 🙂

  • Abel Cuenca

    Mmm, entiendo que la respuesta rápida a la pregunta de por qué open necesita el path absoluto y vi se adapta al relativo es porque vi es más listo :-).

    Echo de menos en el artículo un comentario a los motivos (entiendo que seguridad, principalmente) por los que el directorio actual no suele venir por defecto en el PATH.

    • ¿Te puedes creer que empecé a investigar todo este barullo por ejecutar con cierta facilidad los comandos del AMPS de Atlassian?

      Y una vez que lo conseguí, me pregunté “… si yo he tenido que montar este carajal para tocar el PATH ¿Cómo han hecho los de Atlassian para meterme su directorio por la patilla?” Y así llegué a lo de /etc/paths.d ^_^

  • Hace mucho que no me remango con el terminal, para usar ACK y poco más pero conviene tener en cuenta estas “pildoras” de conocimiento.

  • Muy interesante, ya conocía la existencia del PATH, del profile, etc…  pero no del path_helper en OSX, bastante útil.

  • Víctor Martínez

    Hola, yo también creo que el artículo está equivocado, no necesito tener . en my PATH para abrir un archivo en el directorio actual. Aún así muy útil saber el orden correcto en que se configura, gracias!

    • O_o ¿Tienes un Mac? ¿Trabajas con Java? ¿Tienes algún servidor Tomcat en tu maquina? Vete al directorio /bin del servidor e intenta arrancarlo sin  el ‘.’ en el PATH y sin escribir ./startup.sh y me cuentas que te pasa.

      En realidad, pasa con cualquier .sh que intentes lanzar desde el directorio actual.

      • Hola David, sin ánimo de molestar, yo que si tengo un Mac, trabajo con Java y tengo un Tomcat, me voy al directorio /bin, escribo startup.sh y arranca sin pestañear. Y no tengo el punto en el PATH. Eso si, ni idea de porque, que yo recuerde siempre ha sido así 🙂 

        • Correcto Aitor, si tienes el ‘.’ en el PATH funciona, sino no. Es lo que pone en el artículo 🙂

          Respecto a porque tu tienes el . en el PATH y yo no, ni idea pero, parece ser que es una configuración por defecto de los nuevos Mac.

          Alberto Paz Jiménez apunta en el Twitter que vienen así por una cuestión de seguridad O_o

          https://twitter.com/#!/jalbertopaz/status/161849064269418496

          • Que no tengo el punto en el PATH, eso es lo raruno…

          • O_o 

          • Los entornos tipo Unix, solían ser entornos compartidos. Si añades el directorio actual al path, el comando que se ejecuta puede cambiar dependiendo del directorio en el que estés.
            Simplificando mucho, para no extenderme. El caso más tonto es que alguien ponga un ejecutable llamado ls en un directorio al que tengas que acceder. Cuando intentas hacer un listado del contenido, realmente estás ejecutando este ejecutable.

        • Víctor Martínez

          Es posible que tengas en el PATH la ruta completa al directorio donde está ese script y por ese se puede ejecutar. 

      • Víctor Martínez

        Si tengo un Mac, no trabajo con Java pero lo he probado con otro script de bash y lo que dices en el comentario es correcto, si ‘.’ o el directorio en el que está el ejecutable no están en la variable PATH no se puede ejecutar sin poner ./ delante.

        Pero lo que dice el post no es eso, dice que ‘.’ tiene que estar en el PATH para encontrar un archivo que es un argumento  a otra función (open en este caso) , pero vamos es justo lo que te dice David López en otro comentario.

        Sin acritud, pero ya que hemos empezado a discutirlo vamos a aclararlo ¿no?

        • Tienes más razón que un santo. 

          He revisado el contenido del artículo y el ejemplo -el open de facturas.pdf– no era el más acertado y podía llevar a confusión (como nos ha pasado dando vueltas sobre lo mismo en los comentarios :P).

          El . en el PATH es necesario para ejecutar los comandos que estén en el mismo directorio si dicho directorio no está en ya en el PATH, sin embargo, al llamar a algún comando que ya incluye esa gestión propia del PATH -buscando ./nombre_de_archivo si no encuentra nombre_de_archivo- no es necesario.

          Una vez más, los comentarios del blog no solo complementan, sino que mejoran el contenido.¡Muchas gracias por la contribución Victor!

          • Eso es lo que quería explicar, con mi ejemplo,  pero Victor se ha expresado mejor, todo aclarado. Por mucho Mac OSX que sea la consola sigue funcionando igual que cualquir Linux. 😉

  • Anónimo

    El ./ sólo se aplica archivos ejecutables: si creas un .sh en el directorio actual:
    lo puedes llamar:  “sh nombre_archivos.sh”, si le das permisos de ejecución entonces si no está en el path necesitas llamarlo con ./ si te encuentras en el mismo directorio, sino tendrás que decirle toda la ruta en la cual hallas creado el ejecutable: bin/nombre_archivo.sh

    • Yo creo que ya lo he explicado bastante en el artículo y los comentarios. Si ejecutas algo poniendo sh, ant, vi, open o lo que sea… ese algo se ejecuta porque esos scripts, que SI están en el PATH, tienen un IF como una casa dentro (puedes abrirlos y verlo) donde intentan trabajar con el fichero tal cual y, si no lo encuentran, ellos mismos añaden el ‘./’

      Si te haces un echo $PATH y no tienes el ‘.’, tu directorio actual no está en el PATH y no podrás ejecutar nada directamente. No es un problema de los .sh … es que esos .sh no están en el PATH !!! ^_^

      Un abrazo,
      David

  • David Blanco

    Hola!

    Sólo un apunte por tocarle las bowlings a @david_bonilla:twitter 🙂
    Estaría bien aclarar de qué intérprete de comandos habla el artículo porque creo que todos suponemos que se trata de bash pero no queda claro. Mucha gente piensa que la consola es la que es y sólo hay esa cuando en realidad hay unas cuantas: bash, sh, sch, tcsh, rc, etc.

    Por lo demás, como siempre buen artículo 🙂

    Más info en http://en.wikipedia.org/wiki/Unix_shell

    Un saludo

  • Pingback: Team Foundation Server en nuestros proyectos de Xcode gracias a Git-TF | Objective-C.es()

  • Almogàver

    Holaa!
    Soy Front-End y estoy intentanto instalar Express , yeoman i mil historias. No sé porquè no me reconoce ningún comando de ninguno de esos framworks.

    Llevo un mes intentando solventarlo y no lo logro. Podríamos hablar por mail ? realmente estoy DESESPERADO !!! lourectoret@gmail.com

  • Esto es valido para la versión “El capitan” ?

  • David tengo una carpeta en Libray que no la puedo encontrar por el Finder, pero si la veo por el Terminal, tengo MAC OS X Sierra 10.12.3 y está en Español