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 siPATH
contiene espacios en blanco o[*?
.
Así que en conchas como el tablero conjuntos export PATH=~/opt/bin:$PATH
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 PATH
se 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 deword
es sustituido.
Por lo tanto, $PATH:+$PATH:
se expande a:
- nada, si
PATH
es null o desarmado, $PATH:
, siPATH
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.