Me pregunto dónde se debe agregar una nueva ruta a PATH
Variable ambiental. Sé que esto se puede lograr editando .bashrc
(por ejemplo), pero no está claro cómo hacerlo.
De esta manera:
export PATH=~/opt/bin:$PATH
o esto?
export PATH=$PATH:~/opt/bin
Respuesta aceptada:
Las cosas simples
PATH=$PATH:~/opt/bin
o
PATH=~/opt/bin:$PATH
dependiendo de si desea 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 que todos los demás directorios).
Puede agregar varias entradas al mismo tiempo. PATH=$PATH:~/opt/bin:~/opt/node/bin
o las variaciones en el trabajo de pedidos muy bien. No ponga export
al comienzo de la línea, ya que tiene complicaciones adicionales (consulte a continuación en "Notas sobre shells que no sean bash").
Si su PATH
se construye con muchos componentes diferentes, es posible que termine con entradas duplicadas. Consulte Cómo agregar la ruta del directorio de inicio para que Unix la descubra, ¿qué comando? y elimine las entradas duplicadas de $PATH con el comando awk para evitar agregar duplicados o eliminarlos.
Algunas distribuciones colocan automáticamente ~/bin
en tu RUTA si existe, por cierto.
Dónde ponerlo
Poner la línea 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 te importan los shells que no sean bash). Consulte ¿Cuál es la diferencia entre ellos y cuál debo usar?
No lo pongas en /etc/environment
o ~/.pam_environment
:estos no son archivos 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 muy pronto (de hecho, generalmente en el primer proceso).
En el momento de iniciar sesión, puede confiar en PATH
ya está en el entorno y ya contiene algunos directorios del sistema. Si está escribiendo una secuencia de comandos que puede ejecutarse temprano mientras configura algún tipo de entorno virtual, es posible que deba asegurarse de que PATH
no está vacío y exportado:si PATH
todavía no está configurado, entonces algo como PATH=$PATH:/some/directory
establecería PATH
a :/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 shells que no sean bash
En bash, ksh y zsh, export
es una sintaxis especial, y ambos PATH=~/opt/bin:$PATH
y export PATH=~/opt/bin:$PATH
incluso hacer lo correcto. 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 la descubra, ¿qué comando? para obtener más detalles);$PATH
fuera de las comillas dobles se rompe siPATH
contiene espacios en blanco o[*?
.
Entonces, en shells como dash, establece export PATH=~/opt/bin:$PATH
PATH
a la cadena literal ~/opt/bin/:
seguido del valor de PATH
hasta el primer espacio. PATH=~/opt/bin:$PATH
(una tarea simple) no requiere comillas y hace lo correcto. Si desea utilizar export
en un script portátil, debe 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 al shell Bourne que no aceptaba export var=value
y no hizo expansión de tilde).
¹ Esto no era cierto en los shells de Bourne (como en el shell de Bourne real, no en los shells de estilo POSIX modernos), pero es muy poco probable que encuentre shells tan antiguos en estos días.