¿Cómo configurar permanentemente $ PATH en Linux / Unix?

882

Estoy tratando de agregar un directorio a mi ruta para que siempre esté en mi ruta de Linux. He intentado:

export PATH=$PATH:/path/to/dir

Esto funciona, sin embargo, cada vez que salgo de la terminal y comienzo una nueva instancia de terminal, esta ruta se pierde y necesito ejecutar el comando de exportación nuevamente.

¿Cómo puedo hacerlo para que esto se establezca de forma permanente?

Haga clic en Upvote
fuente

Respuestas:

231

Hay múltiples formas de hacerlo. La solución real depende del propósito.

Los valores variables generalmente se almacenan en una lista de asignaciones o en un script de shell que se ejecuta al inicio del sistema o la sesión del usuario. En el caso del script de shell, debe usar una sintaxis y / exporto setcomandos de shell específicos .

Sistema de ancho

  1. /etc/environmentLista de tareas únicas, permite referencias. Perfecto para añadir directorios de todo el sistema como /usr/local/something/bina PATHvariable o definir JAVA_HOME. Usado por PAM y SystemD.
  2. /etc/environment.d/*.confLista de tareas únicas, permite referencias. Perfecto para añadir directorios de todo el sistema como /usr/local/something/bina PATHvariable o definir JAVA_HOME. La configuración se puede dividir en varios archivos, generalmente uno por cada herramienta (Java, Go, NodeJS). Usado por SystemD que por diseño no pasa esos valores a los shells de inicio de sesión del usuario.
  3. /etc/xprofileScript de shell ejecutado al iniciar la sesión del sistema X Window. Esto se ejecuta para cada usuario que inicia sesión en el sistema X Window. Es una buena opción para las PATHentradas que son válidas para todos los usuarios /usr/local/something/bin. El archivo está incluido en otro script, así que use la sintaxis de shell POSIX, no la sintaxis de su shell de usuario.
  4. /etc/profiley /etc/profile.d/*script de Shell. Esta es una buena opción para sistemas de solo shell. Esos archivos son leídos solo por shells en el modo de inicio de sesión.
  5. /etc/<shell>.<shell>rc. Script de shell. Esta es una mala elección porque es un shell específico. Utilizado en modo sin inicio de sesión.

Sesión de usuario

  1. ~/.pam_environment. Lista de tareas únicas, no se permiten referencias. Cargado por PAM al comienzo de cada sesión de usuario es irrelevante si se trata de una sesión o shell del Sistema X Window. No se puede hacer referencia a otras variables que incluyen HOMEo PATHpor lo que tiene un uso limitado. Usado por PAM.
  2. ~/.xprofileScript de shell. Esto se ejecuta cuando el usuario inicia sesión en el sistema X Window System. Las variables definidas aquí son visibles para cada aplicación X. Elección perfecta para ampliar PATHcon valores como ~/bino ~/go/bino definir usuario específico GOPATHo NPM_HOME. El archivo está incluido en otro script, así que use la sintaxis de shell POSIX, no la sintaxis de su shell de usuario. Su editor de texto gráfico o IDE iniciado por acceso directo verá esos valores.
  3. ~/.profile, ~/.<shell>_profile, ~/.<shell>_loginShell script. Solo será visible para programas iniciados desde terminal o emulador de terminal. Es una buena opción para sistemas de solo shell. Usado por shells en modo de inicio de sesión.
  4. ~/.<shell>rc. Script de shell. Esta es una mala elección porque es un shell específico. Usado por shells en modo sin inicio de sesión.

Notas

Gnome en Wayland inicia el shell de inicio de sesión del usuario para obtener el entorno. Se utiliza de manera efectiva las configuraciones de inicio de sesión de concha ~/.profile, ~/.<shell>_profile, ~/.<shell>_loginarchivos.

Manuales

  • medio ambiente
  • ambiente.d
  • golpetazo
  • guión

Distribución de documentación específica

Relacionado

¿Diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión?

Grzegorz Żur
fuente
44
Gracias por la respuesta detallada, esto debería estar más arriba. ¿Quizás .bash_profiledebería agregarse a la lista también?
James Ko
2
@JamesKo que era el número 4
trve.fa7ad
1
Creo que se sugiere la mejor respuesta /etc/environment. Pero, ¿puedo actualizarlo sin cerrar sesión e iniciar sesión? A veces no uso bash o sh, así source /etc/environmentque no funciona.
banan3'14
2
Genial y en mi opinión la respuesta más completa. Debería estar mucho más arriba.
Peter Gloor
2
Mi razón para buscar este tema fue en realidad Ir. Me alegra ver que no soy el único que se dio cuenta de que .bashrc no es el lugar correcto. ;)
Peter Gloor
1039

Es necesario añadir a su ~/.profileo ~/.bashrcarchivo. 

export PATH="$PATH:/path/to/dir"

Dependiendo de lo que esté haciendo, también es posible que desee vincular a binarios:

cd /usr/bin
sudo ln -s /path/to/binary binary-name

Tenga en cuenta que esto no actualizará automáticamente su ruta durante el resto de la sesión. Para hacer esto, debes ejecutar:

source ~/.profile 
or
source ~/.bashrc
mpowered
fuente
11
Un par de preguntas. 1) ¿No debería haber dos puntos entre $PATHy /usr/bin. 2) /usr/binIncluso debería estar allí. 3) ¿No deberías preferir usar /usr/local/bin?
Batandwa
197
Tenga en cuenta : a menudo se considera un agujero de seguridad para dejar dos puntos al final de su bash PATH porque hace que bash busque en el directorio actual si no puede encontrar el ejecutable que está buscando. Los usuarios que encuentren esta publicación buscando más información deben ser informados de esto.
Erewok
51
@AdamRobertson No es seguro: considere el escenario cuando desempaqueta un tarball, luego cdal directorio en el que lo descomprimió, luego ejecuta ls--- y luego se da cuenta de que el tarball tenía un programa malicioso llamado ls.
Lily Chung
21
Para mí fue .bash_profile, no .profile. Parece que esto es diferente para todos.
donquixote
99
Creo que mejoré significativamente la calidad de esta respuesta y abordé algunos problemas que otros usuarios mencionaron. Cada exportación de ruta, o cada comando que ajusta la ruta, siempre debe asegurarse de separar una ruta existente con dos puntos. Los dos puntos iniciales o finales nunca deben usarse, y el directorio actual nunca debe estar en la ruta.
Erick Robertson
243

En Ubuntu, edita /etc/environment . Su único propósito es almacenar variables de entorno. Originalmente, la variable $ PATH se define aquí. Esta es una pasta de mi /etc/environmentarchivo:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Así que puedes abrir este archivo como root y agregar lo que quieras.

Para resultados inmediatos, ejecute (intente como usuario normal y root):

source /etc/environment && export PATH

ACTUALIZAR:

Si usa zsh(también conocido como Z Shell), agregue esta línea justo después de los comentarios en /etc/zsh/zshenv:

source /etc/environment

Encontré este pequeño capricho en Ubuntu 15.10, pero si su zsh no está obteniendo la RUTA correcta , esta podría ser la razón

trve.fa7ad
fuente
13
No todos los sistemas tienen / etc / environment
user3439968
99
FWIW $PATHtambién se define /etc/profileen Arch Linux.
Sparhawk
3
@ e-sushi En realidad estoy sorprendido por eso. Estoy en Ubuntu 14.04.1 yo mismo. y puedo prometerle que el archivo vino incorporado.
trve.fa7ad
2
Después de probar todas las sugerencias bajo el sol pero / etc / environment y hacer que NO funcionen, finalmente me topé con esto. También estoy en Ubuntu 14.04 y este es el único que realmente cambió la variable PATH después de reiniciar.
Chockomonkey
44
El usuario debe reiniciar la PC después de actualizar el archivo de entorno.
Harish_N
71

Ponga la exportdeclaración en ~/.bashrc. Mi .bashrc contiene esto:

export PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATH
Fraxtil
fuente
77
reinicio necesario?
Haga clic en Upvote
2
Funcionó cuando puse esto en .profile', no se encontró.bashrc
Haga clic en Votación a favor
Puede depender del sistema exacto; No estoy seguro exactamente qué condiciones determinan qué archivo se ejecuta. Sin embargo, me alegro de que el problema haya sido resuelto.
Fraxtil
12
@ Haga clic en Upvote Debe hacerlo source ~/.bashrcpara volver a cargar la .bashrcconfiguración. Entonces funcionará
BigSack
44
La exportpalabra clave solo es necesaria si aún PATHno está marcada como una variable de entorno, lo cual será casi incondicional. Simplemente PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATHtendría el mismo efecto.
Charles Duffy el
30

Puede configurar $PATHpermanentemente de 2 maneras.

  1. Para establecer la ruta para un usuario en particular: Es posible que deba ingresar la entrada en el .bash_profiledirectorio de inicio del usuario.

    por ejemplo, en mi caso, estableceré la ruta de Java en el perfil de usuario de Tomcat

    [tomcat]$ echo "export PATH=$PATH:/path/to/dir" >> /home/tomcat/.bash_profile
  2. Para establecer una ruta común para TODOS los usuarios del sistema, es posible que deba establecer una ruta como esta:

    [root~]# echo "export PATH=$PATH:/path/to/dir" >> /etc/profile
Mohit M
fuente
3
¿El archivo está nombrado /etc/profilescon un sen su distribución? El mío no tiene s. Creo que tienes un error tipográfico.
Chris Johnson
3
Probablemente quiera escapar de los $ que está escribiendo en el archivo de perfil. por ejemplo, echo "export PATH = \ $ PATH: / path / to / dir" >> / etc / profile, de esa manera usted realmente agrega a la variable cuando se ejecuta ese script en lugar de establecerlo en un valor literal basado en su valor en el hora de ejecutar este comando inicial.
BuvinJ
15

Puede usar en Centos o RHEL para usuarios locales:

echo $"export PATH=\$PATH:$(pwd)" >> ~/.bash_profile

Esto agrega el directorio actual (o puede usar otro directorio) a la RUTA, esto lo hace permanente pero surte efecto en el próximo inicio de sesión del usuario.

Si no desea volver a iniciar sesión, puede usar:

source ~/.bash_profile

Que vuelva a cargar # User specific environment and startup programseste comentario está presente en.bash_profile

Daniel Antonio Nuñez Carhuayo
fuente
12

También puede configurar permanentemente, editando uno de estos archivos:

/etc/profile (para todos los usuarios)

~/.bash_profile (para el usuario actual)

~/.bash_login (para el usuario actual)

~/.profile (para el usuario actual)

También puede usar /etc/environmentpara establecer una variable de entorno PATH permanente, pero no admite la expansión de variables .

Extraído de: http://www.sysadmit.com/2016/06/linux-anadir-ruta-al-path.html

Delucaramos
fuente
7

Ayer me topé con esta pregunta cuando buscaba una forma de agregar una carpeta que contenía mis propios scripts a la RUTA, y me sorprendió descubrir que mi propio ~/.profilearchivo (en Linux Mint 18.1) ya contenía esto:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Por lo tanto, todo lo que tenía que hacer era crear la carpeta ~/biny poner mis scripts allí.

RobertG
fuente
7

Creo que la forma más elegante es:

1.Agregue esto en el archivo ~ / .bashrc Ejecute este comando

gedit ~ / .bashrc

agrega tu camino dentro de él

RUTA de exportación = $ RUTA: / opt / node / bin

2.source ~ / .bashrc

(Ubuntu)

Himanshu Sharma
fuente
6

Puede agregar esa línea al archivo de configuración de la consola (por ejemplo, .bashrc), o al perfil.

agua
fuente
2
No tengo ninguno de esos archivos en/home/(username)
Haga clic en Votación a favor
3
@ClickUpvote: ¿Qué shell usas? (Y los archivos que comienzan con un punto están ocultos, necesita algo así como ls -averlos).
David Schwartz
En caso de que no tenga ninguno de esos archivos (bashrc o perfil), puede crearlos manualmente y se usarán automáticamente
trve.fa7ad
4

Agregar permanentemente la variable PATH

Global:

echo "export PATH=$PATH:/new/path/variable" >> /etc/profile

Local (solo para usuarios):

echo "export PATH=$PATH:/new/path/variable" >> ~/.profile

Para reinicio global . Para locales relogin.

Ejemplo

Antes de:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin

Después:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin
export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

Alternativamente, solo puede editar el perfil:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

Otra forma (gracias gniourf_gniourf):

echo 'PATH=$PATH:/new/path/variable' >> /etc/profile

¡No deberías usar comillas dobles aquí! echo 'export PATH = $ PATH: / new / path / variable' ... Y, por cierto, la palabra clave export es muy inútil ya que la variable PATH ya está marcada como exportada. - gniourf_gniourf

usuario3439968
fuente
1
No ¡No deberías usar comillas dobles aquí! echo 'export PATH=$PATH:/new/path/variable'... Y, por cierto, exportes muy probable que la palabra clave sea inútil ya que la PATHvariable ya está marcada como exportada.
gniourf_gniourf
No, debes usar comillas dobles porque $ PATH en comillas simples no interpoladas. Y BTW export también útil.
user3439968
Lo tengo. Puede usar comillas dobles o comillas simples, porque $ PATH se interpola cuando se ejecuta el eco o se interpola cuando se ejecuta / etc / profile.
user3439968
1
@ user3439968 en realidad, las comillas dobles causarán muchos problemas si se agrega a $ PATH desde varios archivos. Considere: cuando usa comillas dobles, $ PATH se traduce a una cadena estática con todos los directorios PATH previamente definidos. digamos que lo anexas /usr/localusando ~/.bashrc. ahora si tiene la intención de agregar /opt/bina la misma variable usando /etc/bash.bashrc; $ PATH se traducirá a la misma cadena estática, como resultado $ PATH se reemplazará en lugar de agregarse a ... Será una cuestión de preferencia del sistema a un archivo sobre otro
trve.fa7ad
4

1.modifique el archivo "/ etc / profile".

#vi /etc/profile

Presione la tecla "i" para ingresar el estado de edición y mover el cursor al final del archivo. Entradas adicionales:

export PATH=$PATH:/path/to/dir;

Presione la tecla "Esc" para salir del estado de edición, ': wq', guarde el archivo.

2.Haga que la configuración sea efectiva

source /etc/profile

Explique: el archivo de perfil funciona para todos los usuarios, si desea ser válido solo para el usuario activo, configure el archivo ".bashrc"

Jia
fuente
4

Después de tanta investigación, encontré una solución simple para esto (estoy usando un sistema operativo básico ), inspirado en el siguiente enlace .

Ejecute el siguiente comando para abrir el archivo .bashrc en modo de edición . [También puede usar vi o cualquier otro editor].

~$ sudo nano ~/.bashrc

Agregue la siguiente línea al final del archivo y guarde.

export PATH="[FLUTTER_SDK_PATH]/flutter/bin:$PATH"

Por ejemplo :

export PATH="/home/rageshl/dev/flutter/bin:$PATH"

ingrese la descripción de la imagen aquí

Creo que esta es la solución permanente para configurar la ruta en el aleteo en la distribución de Ubuntu

Espero que esto sea útil.

Ragesh S
fuente
3

los archivos donde agrega el comando de exportación dependen de si está en modo de inicio de sesión o no.

si está en modo de inicio de sesión, los archivos que está buscando son / etc / bash o /etc/bash.bashrc

si está en modo sin inicio de sesión, está buscando el archivo /.profile o los archivos dentro del directorio /.profiles.d

los archivos mencionados anteriormente si están las variables del sistema.

Dikinha
fuente
3

Añadir a la /etc/profile.dcarpeta de scripts [name_of_script].shcon la línea: export PATH=$PATH:/dir. Cada secuencia de comandos dentro de la /etc/profile.dcarpeta se ejecuta automáticamente al /etc/profileiniciar sesión.

Yuriy
fuente
Es la forma recomendada de cómo personalizar su entorno
Yuriy
1
Esto es solo si desea que la configuración sea para todo el sistema, lo que probablemente no sea el caso de uso más común. La mayoría de la gente quiere (o debería querer) que el camino se establezca localmente, porque la mayoría de los usuarios / roles realizan operaciones contextualmente diferentes, y cuantos menos supuestos hagas, mejor.
mpowered
@mpowered, sí, esto es solo para todo el sistema. Si desea cambiar la RUTA localmente, debe agregar la misma exportación en ~ / .profile o ~ / .bashrc. Aquí debe considerar que los shells de inicio de sesión leen ~ / .profile y los shells interactivos leen ~ / .bashrc. Esto es muy importante porque ssh, por ejemplo, no inicia sesión, por lo tanto, ~ / .profile no se leerá. Varias distribuciones como suse source ~ / .bashrc en / etc / profile. Pero no es común para todos los linux '
Yuriy
3

Zues77 tiene la idea correcta. El OP no dijo "cómo puedo hackear mi camino a través de esto". OP quería saber cómo agregar permanentemente a $ PATH:

sudo nano /etc/profile

Aquí es donde está configurado para todo y es el mejor lugar para cambiarlo para todas las cosas que necesitan $ PATH

Joe D
fuente
3

Mi respuesta se refiere a la configuración de go-langon Ubuntu linux/amd64. Me he enfrentado al mismo problema de configurar la ruta de las variables de entorno ( GOPATHy GOBIN), perderla en la salida de la terminal y reconstruirla usando source <file_name>cada vez. El error fue poner la ruta ( GOPATHy GOBIN) en la ~/.bash_profilecarpeta. Después de pasar unas buenas horas, encontré que la solución era poner GOPATHy GOBINen el ~/.bash_rcarchivo de la forma:

export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOPATH:$GOBIN

y al hacerlo, la instalación de go funcionó bien y no hubo pérdidas de ruta.

EDITAR 1: La razón por la cual este problema puede estar relacionado es que la configuración para shells sin inicio de sesión como su terminal ubuntu o gnome-terminal donde ejecutamos el código go se toma del ~./bash_rcarchivo y la configuración de los shells de inicio de sesión se toma del ~/.bash_profilearchivo, y desde ~/.profilearchivo si el ~/.bash_profilearchivo no es accesible.

Abhiroj Panwar
fuente
3

Digamos que está ejecutando MacOS y tiene un archivo binario en el que confía y desea ponerlo a disposición en todo su sistema, pero no necesariamente quiere el directorio en el que se agregará el archivo binario a su RUTA, puede optar por copiar / mover el binario a /usr/local/bin, que ya debería estar en su RUTA. Esto hará que el binario sea ejecutable como cualquier otro binario al que ya tenga acceso en su terminal.

León
fuente
3

Se puede agregar directamente usando el siguiente comando:

echo 'export PATH=$PATH:/new/directory' >> ~/.zshrc
source ~/.zshrc
Anoop Nagabhushan
fuente
2
La pregunta está etiquetada bash, por lo que no es muy útil.
Laurenz Albe
2
Esta es una respuesta válida -> el título solo menciona Linux, por lo que bash y TAMBIÉN zsh servirá ... si el etiquetado es solo "bash", también debemos agregar "zsh" a las etiquetas
Carlos Saltos
2

la mejor manera simple es la siguiente línea:
PATH="<directory you want to include>:$PATH"
en su archivo .bashrc en el directorio de inicio.
No se restablecerá incluso si cierra el terminal o reinicia su PC. Es permanente

Edward Torvalds
fuente
1
@quant si haces lo que se dice, establecerá tu configuración de forma permanente. funcionará incluso si cierra la terminal.
Edward Torvalds
1

Creo que la forma más elegante es:

1.Agregue esto en el archivo ~. / Bashrc

if [ -d "new-path" ]; then
  PATH=$PATH:new-path
fi

2.source ~ / .bashrc

(Ubuntu)

Gimcuan Hui
fuente
Y para mostrar la ruta de acceso anterior: printf "% s \ n" $ PATH
Robot70
1

Una forma de agregar una ruta permanente, que funcionó para mí, es:

    cd /etc/profile.d
    touch custom.sh
    vi custom.sh 
    export PATH=$PATH:/path according to your setting/

reinicie su computadora y aquí vamos camino habrá aplausos permanentes.

usuario6393373
fuente
En realidad no necesita reiniciar su computadora. Cerrar sesión y volver a iniciarla es suficiente. Esta es una solución bastante elegante, ya que es muy fácil anular cualquier cambio sin necesidad de editar archivos. También es fácil especificar una instrucción if para que si un directorio no existe en el sistema, no se agregue a la variable PATH.
Warwick
0

Para la distribución de Debian, debe:

    - edit ~/.bashrc  e.g: vim ~/.bashrc 
    - add export PATH=$PATH:/path/to/dir
    - then restart your computer. Be aware that if you edit ~/.bashrc  as root, your environment variable you added will work only for root
sólo yo
fuente
0

Esta es una frase . Agrega una línea al .bashrc. La línea comprobará si el directorio ya se ha agregado a la ruta y agregará si no. Esto evitará la duplicación de tu directorio en la ruta cada vez que lo obtengas .bashrc.

echo "[[ \":\$PATH:\" != *\":$(pwd)/path/to/add:\"* ]] && export PATH=\"\${PATH:+\${PATH}}:$(pwd)/path/to/add\"" >> ~/.bashrc

source ~/.bashrc
sr9yar
fuente