Saltar al contenido

¿Cómo agregar correctamente una ruta a PATH?

Solución:

Las cosas simples

PATH=$PATH:~/opt/bin

o

PATH=~/opt/bin:$PATH

dependiendo de si quieres agregar ~/opt/bin al final (para buscar después de todos los demás directorios, en caso de que haya un programa con el mismo nombre en varios directorios) o al principio (para buscar antes de todos los demás directorios).

Puede agregar varias entradas al mismo tiempo. PATH=$PATH:~/opt/bin:~/opt/node/bin o variaciones en el pedido funcionan bien. No pongas export al principio de la línea, ya que tiene complicaciones adicionales (ver más abajo en “Notas sobre shells distintos de bash”).

Si tu PATH se construye con muchos componentes diferentes, puede terminar con entradas duplicadas. Consulte Cómo agregar la ruta del directorio de inicio para que Unix lo descubra, ¿qué comando? y Elimine las entradas $ PATH duplicadas con el comando awk para evitar agregar duplicados o eliminarlos.

Algunas distribuciones ponen automáticamente ~/bin en su RUTA si existe, por cierto.

Donde ponerlo

Pon la linea para modificar PATH en ~/.profile, o en ~/.bash_profile si eso es lo que tienes.

Tenga en cuenta que ~/.bash_rc no es leído por ningún programa, y ~/.bashrc es el archivo de configuración de instancias interactivas de bash. No debe definir variables de entorno en ~/.bashrc. El lugar adecuado para definir variables de entorno como PATH es ~/.profile (o ~/.bash_profile si no le importan otras conchas que no sean bash). Consulte ¿Cuál es la diferencia entre ellos y cuál debería usar?

No lo pongas /etc/environment o ~/.pam_environment: estos no son archivos de shell, no puede usar sustituciones como $PATH ahí. En estos archivos, solo puede anular una variable, no agregarla.

Posibles complicaciones en algunos scripts del sistema

No necesitas export si la variable ya está en el entorno: cualquier cambio del valor de la variable se refleja en el entorno. PATH está casi siempre en el medio ambiente; todos los sistemas Unix lo configuran desde el principio (generalmente en el primer proceso, de hecho).

En el momento del inicio de sesión, puede confiar en PATH ya está en el entorno y ya contiene algunos directorios del sistema. Si está escribiendo un script que puede ejecutarse antes mientras configura algún tipo de entorno virtual, es posible que deba asegurarse de que PATH no está vacío y se exporta: si PATH todavía no está configurado, entonces algo como PATH=$PATH:/some/directory establecería PATH para :/some/directory, y el componente vacío al principio significa el directorio actual (como .:/some/directory).

if [ -z "$PATH-" ]; then export PATH=/usr/local/bin:/usr/bin:/bin; fi

Notas sobre conchas distintas de bash

En bash, ksh y zsh, export es una sintaxis especial, y tanto PATH=~/opt/bin:$PATH y export PATH=~/opt/bin:$PATH haz lo correcto incluso. En otros shells de estilo Bourne / POSIX como dash (que es /bin/sh en muchos sistemas), export se analiza como un comando ordinario, lo que implica dos diferencias:

  • ~ solo se analiza al comienzo de una palabra, excepto en las asignaciones (consulte ¿Cómo agregar la ruta del directorio de inicio para que Unix descubra qué comando? para más detalles);
  • $PATH fuera de las comillas dobles se rompe si PATH contiene espacios en blanco o [*?.

Así que en conchas como el tablero export PATH=~/opt/bin:$PATH conjuntos PATH al literal string ~/opt/bin/: seguido del valor de PATH hasta el primer espacio.
PATH=~/opt/bin:$PATH (una tarea simple) no requiere cotizaciones y hace lo correcto. Si quieres usar export en un script portátil, debes escribir export PATH="$HOME/opt/bin:$PATH", o PATH=~/opt/bin:$PATH; export PATH (o PATH=$HOME/opt/bin:$PATH; export PATH para la portabilidad incluso para el shell Bourne que no aceptaba export var=value y no hizo expansión de tilde).

¹ Esto no fue true en los shells Bourne (como en el shell Bourne real, no en los shells modernos de estilo POSIX), pero es muy poco probable que encuentre conchas tan viejas en estos días.

De cualquier manera funciona, pero no hacen lo mismo: los elementos de PATHse marcan de izquierda a derecha. En su primer ejemplo, los ejecutables en ~/opt/bin tendrá prioridad sobre los instalados, por ejemplo, en /usr/bin, que puede ser o no lo que desea.

En particular, desde el punto de vista de la seguridad, es peligroso agregar rutas al frente, porque si alguien puede obtener acceso de escritura a su ~/opt/bin, pueden poner, por ejemplo, un diferente ls allí, que probablemente usarías en lugar de /bin/ls sin darme cuenta. Ahora imagina lo mismo para ssh o su navegador o elección … (Lo mismo vale triplemente para poner. en su camino).

La forma a prueba de balas de agregar / anteponer

Tratar no usando

PATH=$PATH:~/opt/bin

o

PATH=~/opt/bin:$PATH

¿Por qué?
Hay muchas consideraciones involucradas en la elección de agregar o anteponer. Muchos de ellos están cubiertos en otras respuestas, por lo que no los repetiré aquí.

Un punto importante es que, incluso si los scripts del sistema no usan esto (me pregunto por qué)* 1, la forma a prueba de balas de agregar una ruta (p. ej., ~/opt/bin) a la variable de entorno PATH es

PATH="$PATH:+$PATH:~/opt/bin"

para agregar (en lugar de PATH="$PATH:~/opt/bin") y

PATH="~/opt/bin$PATH:+:$PATH"

para anteponer (en lugar de PATH="~/opt/bin:$PATH")

Esto evita los dos puntos iniciales / finales falsos cuando $PATH está inicialmente vacío, lo que puede tener efectos secundarios no deseados y puede convertirse en una pesadilla, difícil de encontrar (esta respuesta trata brevemente del caso del awk-camino).

Explicación (de Shell Parameter Expansion):

$parameter:+word

Si parameter es null o desarmado, nada se sustituye, de lo contrario la expansión de word es sustituido.

Por lo tanto, $PATH:+$PATH: se expande a:

  1. nada, si PATH es null o desarmado,
  2. $PATH:, si PATH Está establecido.

Nota: Esto es para bash.


* 1 Acabo de descubrir que scripts como `devtoolset-6 / enable` realmente usan esto,

$ cat /opt/rh/devtoolset-6/enable
# General environment variables
export PATH=/opt/rh/devtoolset-6/root/usr/bin$PATH:+:$PATH
...

Reseñas y calificaciones

Agradecemos que desees añadir valor a nuestro contenido participando con tu experiencia en las explicaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *