Me pregunto dónde se debe agregar una nueva ruta a la PATH
variable de entorno. 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
PATH=$PATH:$HOME/.local/bin:$HOME/bin
, se puede agregar otra separando con: egPATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/ec2-user/pear/bin
.Respuestas:
Las cosas simples
o
dependiendo de si desea agregar
~/opt/bin
al final (para buscar 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 orden funcionan bien. No coloqueexport
al comienzo de la línea ya que tiene complicaciones adicionales (consulte más abajo en "Notas sobre los depósitos que no sean bash").Si
PATH
se compila por muchos componentes diferentes, puede terminar con entradas duplicadas. Consulte ¿Cómo agregar la ruta del directorio de inicio para que Unix descubra qué comando? y Eliminar entradas duplicadas de $ PATH con el comando awk para evitar agregar duplicados o eliminarlos.Algunas distribuciones se colocan automáticamente
~/bin
en su RUTA si existe, por cierto.Donde ponerlo
Ponga la línea de modificar
PATH
en~/.profile
, o~/.bash_profile
si eso es lo que tiene.Tenga en cuenta que
~/.bash_rc
ningún programa lo lee y~/.bashrc
es el archivo de configuración de instancias interactivas de bash. No debe definir variables de entorno en~/.bashrc
. El lugar correcto para definir variables de entorno comoPATH
es~/.profile
(o~/.bash_profile
si no le importan los shells que no sean bash). Vea ¿Cuál es la diferencia entre ellos y cuál debo usar?No lo pongas
/etc/environment
o~/.pam_environment
: estos no son archivos de shell, no puedes usar sustituciones como$PATH
allí. En estos archivos, solo puede anular una variable, no agregarla.Posibles complicaciones en algunos scripts del sistema
No es necesario
export
si la variable ya está en el entorno: cualquier cambio en el valor de la variable se refleja en el entorno.PATH
¹ es casi siempre en el entorno; todos los sistemas unix lo configuraron desde el principio (de hecho, generalmente en el primer proceso).En el momento de iniciar sesión, puede confiar en
PATH
que ya está en el entorno y que ya contiene algunos directorios del sistema. Si estás escribiendo un guión que puede ser ejecutado temprana, mientras que la creación de algún tipo de entorno virtual, es posible que necesite para asegurarse de quePATH
no está vacío y se exportan: siPATH
todavía está desactivada, entonces algo asíPATH=$PATH:/some/directory
sería ajustadoPATH
a:/some/directory
, y el componente de vacío al principio significa el directorio actual (como.:/some/directory
).Notas sobre conchas que no sean bash
En bash, ksh y zsh,
export
es una sintaxis especial, y ambosPATH=~/opt/bin:$PATH
yexport PATH=~/opt/bin:$PATH
hacer lo correcto, incluso. En otros shells de estilo Bourne / POSIX, como el guión (que se encuentra/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\[*?
.Entonces, en shells como el guión, se
estableceexport PATH=~/opt/bin:$PATH
PATH
en la cadena literal~/opt/bin/:
seguida del valor dePATH
hasta el primer espacio.PATH=~/opt/bin:$PATH
(una asignación simple) no requiere comillas y hace lo correcto. Si desea usarexport
en un script portátil, necesita escribirexport PATH="$HOME/opt/bin:$PATH"
, oPATH=~/opt/bin:$PATH; export PATH
(oPATH=$HOME/opt/bin:$PATH; export PATH
para portabilidad incluso en el shell Bourne que no aceptóexport var=value
y no hizo una expansión de tilde).¹ Esto no era cierto en los proyectiles Bourne (como en el proyectil Bourne real, no en los proyectiles modernos de estilo POSIX), pero es muy poco probable que se encuentren con proyectiles tan viejos en estos días.
fuente
export
..bashrc
. Supongo que porque FZF está escrito en Rust también está siguiendo el patrón de Rust.De cualquier manera funciona, pero no hacen lo mismo: los elementos de
PATH
se verifican de izquierda a derecha. En su primer ejemplo, los ejecutables en~/opt/bin
tendrán prioridad sobre los instalados, por ejemplo, en/usr/bin
, que pueden o no ser 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 la suya
~/opt/bin
, puede poner, por ejemplo, una diferentels
allí, que probablemente usaría en su lugar. de/bin/ls
sin darse cuenta. Ahora imagina lo mismo parassh
tu navegador o tu elección ... (Lo mismo se aplica al ponerlo en tu camino).fuente
ls
, debe colocarla en un directorio antes/bin
.Estoy confundido con la pregunta 2 (ya que se eliminó de la pregunta porque se debió a un problema no relacionado):
Si usted dice
eso es todo lo que estará en tu RUTA. RUTA es solo una variable de entorno, y si desea agregar a la RUTA, debe reconstruir la variable con exactamente el contenido que desea. Es decir, lo que da como ejemplo a la pregunta 2 es exactamente lo que quiere hacer, a menos que me esté perdiendo totalmente el punto de la pregunta.
Yo uso ambos formularios en mi código. Tengo un perfil genérico que instalo en cada máquina en la que trabajo que se ve así, para acomodar directorios que pueden faltar:
fuente
La forma a prueba de balas de anexar / anteponer
Hay muchas consideraciones involucradas en la elección de anexar versus 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 para agregar una ruta (p. Ej.
$HOME/bin
) A la variable de entorno PATH espara anexar (en lugar de
PATH="$PATH:$HOME/bin"
) ypara anteponer (en lugar de
PATH="$HOME/bin:$PATH"
)Esto evita el colon espurio
$PATH
inicial / final cuando 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 el caso en elawk
camino).Explicación (de la expansión del parámetro Shell ):
Por lo tanto,
${PATH:+${PATH}:}
se expande a: 1) nada, siPATH
es nulo o no establecido, 2)${PATH}:
, siPATH
está establecido.Nota : Esto es para bash.
* 1 Acabo de descubrir que los scripts como
devtoolset-6/enable
realmente usan esto,fuente
Linux determina la ruta de búsqueda ejecutable con la
$PATH
variable de entorno. Para agregar directorio / data / myscripts al comienzo de la$PATH
variable de entorno, use lo siguiente:Para agregar ese directorio al final de la ruta, use el siguiente comando:
Pero lo anterior no es suficiente porque cuando establece una variable de entorno dentro de un script, ese cambio es efectivo solo dentro del script. Solo hay dos formas de evitar esta limitación:
Ejemplos:
La inclusión básicamente incorpora el guión "llamado" en el guión "llamado". Es como un #include en C. Por lo tanto, es efectivo dentro del script o programa "llamado". Pero, por supuesto, no es efectivo en ningún programa o script llamado por el programa de llamada. Para que sea efectivo en toda la cadena de llamadas, debe seguir la configuración de la variable de entorno con un comando de exportación.
Como ejemplo, el programa bash shell incorpora los contenidos del archivo .bash_profile por inclusión. Coloque las siguientes 2 líneas en .bash_profile:
efectivamente coloca esas 2 líneas de código en el programa bash. Entonces, dentro de bash, la variable $ PATH incluye
$HOME/myscript.sh
, y debido a la declaración de exportación, cualquier programa llamado por bash tiene la$PATH
variable alterada . Y dado que bash llama a cualquier programa que ejecute desde un indicador bash, la nueva ruta está en vigor para todo lo que ejecute desde el indicador bash.La conclusión es que para agregar un nuevo directorio a la ruta, debe agregar o anteponer el directorio a la variable de entorno $ PATH dentro de un script incluido en el shell, y debe exportar la
$PATH
variable de entorno.Más información aquí.
fuente
Desde hace algún tiempo he mantenido conmigo dos funciones
pathadd
ypathrm
que ayudan en la adición de elementos a la ruta sin la necesidad de preocuparse por las duplicaciones.pathadd
toma un argumento de ruta única y unafter
argumento opcional que, si se proporciona, se agregará alPATH
caso anterior.En casi todas las situaciones, si está agregando a la ruta, es probable que desee anular cualquier cosa que ya esté en la ruta, por lo que opto por anteponer por defecto.
Ponga esto en cualquier script que desee alterar el entorno PATH y ahora puede hacerlo.
Le garantizamos que no agregará a la ruta si ya está allí. Si ahora quieres asegurarte
/baz/bat
es al principio.Ahora cualquier camino se puede mover al frente si ya está en el camino sin duplicarlo.
fuente
No puedo hablar por otras distribuciones, pero Ubuntu tiene un archivo, / etc / environment, que es la ruta de búsqueda predeterminada para todos los usuarios. Como mi computadora solo la uso yo, pongo los directorios que quiero en mi camino allí, a menos que sea una adición temporal que coloque en un script.
fuente
Hay algunas situaciones en las que su uso
PATH=/a/b:$PATH
podría considerarse la forma "incorrecta" de agregar una ruta aPATH
:PATH
en la misma forma.PATH
una forma diferente (es decir, un alias debido al uso de enlaces simbólicos o..
).PATH
cuando está destinado a anular otras entradasPATH
.Esta función (solo Bash) hace lo "correcto" en las situaciones anteriores (con una excepción, ver más abajo), devuelve códigos de error e imprime mensajes agradables para humanos. Los códigos y mensajes de error se pueden deshabilitar cuando no se desean.
La excepción es que esta función no canoniza las rutas agregadas a
PATH
través de otros medios, por lo que si hay un alias no canónico para una rutaPATH
, esto agregará un duplicado. IntentarPATH
canonizar las rutas que ya están en una propuesta incierta ya que una ruta relativa tiene un significado obvio cuando se pasa a,prepath
pero cuando ya se encuentra en la ruta no se sabe cuál era el directorio de trabajo actual cuando se agregó.fuente
$PATH
que tenía antes. En cuanto a-r
, no, creo que las rutas relativas en$PATH
son demasiado poco confiables y extrañas (¡tu ruta cambia cada vez que túcd
!) Para querer apoyar algo así en una herramienta general.Para mí (en Mac OS X 10.9.5), agregar el nombre de la ruta (por ejemplo
/mypathname
) al archivo/etc/paths
funcionó muy bien.Antes de editar,
echo $PATH
devuelve:Después de editar
/etc/paths
y reiniciar el shell, se agrega la variable $ PATH/pathname
. De hecho,echo $PATH
devuelve:Lo que sucedió es que
/mypathname
se ha agregado a la$PATH
variable.fuente
Para agregar una nueva ruta a la
PATH
variable de entorno:Para que este cambio se aplicará a todos los depósitos se abre, añadirlo al archivo que el shell la fuente cuando se invoca. En diferentes shells esto puede ser:
p.ej
Puede ver la ruta proporcionada en la salida anterior.
fuente
Aquí está mi solución:
Un lindo y sencillo revestimiento que no deja rastro
:
fuente