¿Cómo recargo .bashrc sin cerrar sesión y volver a iniciarla?

Respuestas:

2638

Solo tienes que ingresar el comando:

source ~/.bashrc

o puede usar la versión más corta del comando:

. ~/.bashrc
George Hawkins
fuente
88
Esto no es exactamente lo mismo que iniciar y cerrar sesión. Digamos que tenía la siguiente línea en .bashrc:, export PATH=$PATH:fooy luego la cambia a export PATH=$PATH:bar. Si inicia la sesión y ir hacia atrás, solamente barestará en el camino, pero si lo que usted sugiere, tanto fooy barestará en el PATH. ¿Conoces alguna forma de evitar esto?
HighCommander4
77
@ HighCommander4: una forma muy insatisfactoria de hacer lo que quiere es hacer "bash -l", sin embargo, esto realmente crea una nueva subshell y cuando cierra la sesión volverá a la shell envolvente donde "foo" todavía está en PATH. Si solo está interesado en PATH, puede hacer "unset PATH" y reconstruirlo desde cero, pero probablemente sea más fácil / seguro hacer "PATH = / bin: / usr / bin" antes de obtener su .bashrc. La forma en que se construye la variable PATH en el inicio de sesión es en realidad razonablemente compleja, involucrando al menos la entrada desde el inicio de sesión (consulte "inicio de sesión de man") y / etc / profile (consulte "bash de hombre").
George Hawkins el
2
@Alex puede automatizarlo agregando la línea ~ / .bashrc en ~ / .bash_profile, aunque no sé si es una buena práctica.
Vivek Gani
44
También recomendaría crear un alias (que podría almacenar en ~ / .bashrc o ~ / .bash_aliases) que abra .bashrc y lo vuelva a cargar después de que el editor salga. Puede hacerlo mediante la combinación de dos comandos en un alias, por ejemplo, al igual que (si vim es su editor preferido, de lo contrario intercambiarlo con otra cosa): alias editbashrc='vim ~/.bashrc; source ~/.bashrc'. Esto hará que la edición sea mucho más fluida, ya que no necesita pensar en la recarga, después de hacer la edición, si usa el alias personalizado.
Samuel Lampa
66
Afectará solo al terminal actual.
matepal297
284

O podrías usar:

exec bash

Esto hace lo mismo y es más fácil de recordar (al menos para mí).

El execcomando reemplaza completamente el proceso de shell ejecutando la línea de comando especificada. En nuestro ejemplo, reemplaza lo que sea el shell actual con una nueva instancia de bash(con los archivos de configuración actualizados).

WhoSayIn
fuente
13
¿Podría explicar la diferencia de source .bashrcmando y exec bash?
muradin
18
@muradin, sourcees un comando de shell incorporado que ejecuta el contenido del archivo pasado como argumento, en el shell actual . Entonces, en su ejemplo, ejecuta el archivo .bashrc en el shell actual. Y el execcomando reemplaza el shell con un programa dado, en su ejemplo, reemplaza su shell con bash (con los archivos de configuración actualizados)
WhoSayIn
3
En mi circunstancia hiperespecífica, esto se sacudió totalmente. My Dockerfile ejecuta un script de instalación que modifica .bashrc. Luego necesito que se vuelva a cargar, pero . ~/.bashrcse ejecutará en dashlugar de hacerlo bash, por lo que hay un error porque shoptfalta. sourceno se encuentra desde el shell, por lo que esa solución también está fuera. ¡Probé esto y la imagen del acoplador se construyó sin problemas!
m59
99
Elegante, pero "hace lo mismo" no es del todo correcto. source ~/.bashrcpreservará todo su entorno de shell (aunque probablemente se modificó por el origen de ~/.bashrc), mientras exec bashque solo conservará las variables de entorno de su shell actual (cualquier cambio ad-hoc al shell actual en términos de variables de shell, función, opciones se pierden). Dependiendo de sus necesidades, puede preferirse uno u otro enfoque.
mklement0
12
@SEoF, cuando dices "bash inception" y si estás pensando lo que creo que estás pensando, debo decir que estás equivocado. A diferencia de la película, no continúas yendo a bash de bash cuando lo haces repetidamente exec bash. El execcomando reemplaza el shell con el programa, en nuestro caso, bash. Por lo tanto, siempre hay una instancia de bash en el terminal.
John Red
121

Para complementar y contrastar las dos respuestas más populares, . ~/.bashrcy exec bash:

Ambas soluciones se recargan efectivamente~/.bashrc , pero hay diferencias:

  • . ~/.bashrco source ~/.bashrcse preservar su shell actual :

    • Excepto por las modificaciones que realiza la recarga ~/.bashrcen el shell actual ( fuente ), el shell actual y su estado se conservan , lo que incluye variables de entorno, variables de shell, opciones de shell, funciones de shell e historial de comandos.
  • exec basho, más enérgicamente, exec "$BASH"[1] , reemplazará su shell actual con una nueva instancia y, por lo tanto, solo conservará las variables de entorno de su shell actual (incluidas las que haya definido ad-hoc).

    • En otras palabras: cualquier cambio ad-hoc al shell actual en términos de variables de shell, funciones de shell, opciones de shell, historial de comandos se pierde.

Dependiendo de sus necesidades, puede preferirse uno u otro enfoque.


[1] exec bashen teoría podría ejecutar un ejecutable diferente bash al que inició el shell actual, si es que existe en un directorio mencionado anteriormente en el $PATH. Dado que la variable especial $BASHsiempre contiene la ruta completa del ejecutable que inició el shell actual, exec "$BASH"se garantiza que usará el mismo ejecutable.
Una nota "..."al respecto $BASH: las comillas dobles aseguran que el valor de la variable se use tal cual, sin la interpretación de Bash; Si el valor no tiene espacios incrustados u otros metacaracteres de shell (lo cual no es probable en este caso), no necesita estrictamente comillas dobles, pero usarlos es un buen hábito para formar.

mklement0
fuente
Respondiste mi pregunta antes de que pudiera preguntarla. Esto es bueno saberlo; A menudo configuro mi CLASSPATH para una sola sesión.
porcinos
Entonces, incluso si llamo al exec "$ BASH", ¿se encontrarán las variables que establece .bashrc en el shell que abro a continuación (usando el mismo ejecutable que mi sesión actual)?
nitinr708
3
@ nitinr708: Sí, la exec $BASHfuente ~/.bashrc, por lo que verá sus cambios en el entorno de shell en la nueva sesión.
mklement0
@ Gaming32, aprecio la idea de una nota al pie hipervinculada, pero en realidad no funcionó (y en una respuesta tan breve como esta, no es tan importante).
mklement0
44

Alguien editó mi respuesta para agregar un inglés incorrecto, pero aquí estaba el original, que es inferior a la respuesta aceptada.

. .bashrc
Randy Proctor
fuente
25
Esto solo funcionará si su directorio actual es en realidad su directorio personal. Lo siguiente funcionará:. ~ / .bashrc
Brian Showalter
66
¿Qué hace que esto funcione? ¿Qué sucede realmente cuando hago ".bashrc"? ¡Gracias!
Jed Daniels
54
. es un acceso directo de BASH para el comando incorporado "fuente". Entonces, ".bashrc" es lo mismo que ".bashrc de origen" para el intérprete de BASH.
Brian Showalter
77
Frio. Gracias. Ahora que no lo sabía.
Jed Daniels
2
Acabo de enviar una solicitud de edición para agregar ~/, pero dado que la respuesta principal muestra ambas source ~/.bashrcy . ~/.bashrcme pregunto si esta respuesta debería eliminarse como redundante.
Max Ghenis
18

Dependiendo de su entorno, simplemente escribiendo

bash

También puede funcionar.

James
fuente
15
Sin embargo, esto invocará un nuevo shell dentro del actual, desperdiciando recursos. Mejor use la solución ejecutiva de @ WhoSayln que reemplaza el shell actual con el recién invocado.
Bernhard Wagner
Sí, solo usa la fuente. Esto es completamente innecesario y molesto.
dylnmc
Además de comentario de @ BernhardWagner, también pierde su historial de bash actual si su engendro un nuevo shell
peterchaula
Esta es una buena solución por la cual el acceso de privilegios de usuario es limitado.
Tunde Pizzle
Invocar un subproceso agrega una capa de complejidad que no tiene valor adicional.
Alan Berezin
18

Con esto, ni siquiera tendrá que escribir "source ~ / .bashrc":

Incluya su archivo bashrc:

alias rc="vim ~/.bashrc && source ~/.bashrc"

Cada vez que desee editar su bashrc, simplemente ejecute el alias " rc "

Roy Lin
fuente
15
. ~/.bashrc

. es una construcción incorporada por mandato POSIX


Alternativas

source ~/.bashrc

sourcees un sinónimo de punto / período .en bash, pero no en POSIX sh, por lo que para una compatibilidad máxima use el punto.

exec bash
  • execcomando reemplaza el shell con un programa dado ... - WhoSayIn
Geoffrey Hale
fuente
2
exec bashTodavía hereda el entorno del shell actual. exec env -i bashestaría más cerca (o exec env -i bash -lsi actualmente está en un shell de inicio de sesión).
chepner
5

Dependiendo de su entorno, es posible que desee agregar secuencias de comandos para que .bashrc se cargue automáticamente cuando abra una sesión SSH. Recientemente hice una migración a un servidor que ejecuta Ubuntu, y allí, .profile, no .bashrc o .bash_profile se carga por defecto. Para ejecutar cualquier script en .bashrc, tenía que ejecutar source ~/.bashrccada vez que se abría una sesión, lo que no ayuda al ejecutar implementaciones remotas.

Para que su .bashrc se cargue automáticamente al abrir una sesión, intente agregar esto a .profile:

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Vuelva a abrir su sesión, y debería cargar cualquier ruta / script que tenga en .bashrc.

karolus
fuente
Tengo esto en ".profile" pero no funciona; cada vez que salgo, tengo que hacerlo a mano. ¿Alguna sugerencia?
Wayne Smallman
4

Utilicé easyengine para configurar mi servidor basado en la nube vultr.
Encontré mi archivo bash en /etc/bash.bashrc.

¡Lo mismo source /etc/bash.bashrchizo el truco para mí!

actualizar

Al configurar un servidor simple (ubuntu 16.04), puede usar la información anterior, cuando aún no ha configurado un nombre de usuario y está iniciando sesión a través de root.

Es mejor crear un usuario (con privilegios de sudo) e iniciar sesión como este nombre de usuario.
Esto creará un directorio para su configuración, incluidos los archivos .profile y .bashrc.
https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/

Ahora, editará y (y "fuente") el ~/.bashrcarchivo.

En mi servidor, esto estaba ubicado en /home/your_username/.bashrc
(donde your_usernamees realmente el nuevo nombre de usuario que creó anteriormente, y ahora inicie sesión con)

SherylHohman
fuente
4

exec bash es una excelente manera de volver a ejecutar y lanzar un nuevo shell para reemplazar el actual. solo para agregar a la respuesta, $ SHELL devuelve el shell actual que es bash. Al usar lo siguiente, volverá a cargar el shell actual, y no solo a bash.

exec $SHELL -l;

Jimmy MG Lim
fuente
3

Para mí, lo que funciona cuando cambio la RUTA es: exec "$BASH" --login

Cecília Assis
fuente
La pregunta es acerca de la recarga ~/.bashrc, lo que --loginhará que no recarga (directamente); a nivel de usuario, se recargará ~/.bash_profile(o ~/.bash_logino ~/.profile) en su lugar.
mklement0
3

tipo:

source ~/.bashrc

o, en forma más corta:

. ~/.bashrc

jwismar
fuente
1
Nuevamente, funciona solo si está en el directorio de inicio, o más precisamente, en el directorio donde .bashrcse encuentra. Una forma más correcta de hacer esto, como se dice en la respuesta aceptada, es source ~/.bashrc.
John Red
2

uso el siguiente comando en msysgit

. ~/.bashrc

versión más corta de

source ~/.bashrc
Sojan V Jose
fuente
@jwg la respuesta aceptada es. .bashrc. funcionará solo si está en el directorio de inicio en msysgit.
Sojan V Jose
@jwg ok, creo que estaba mencionando que no tienes que escribir 'source ~ / .bashrc' en su lugar usa la versión más corta.
Sojan V Jose
@jwg bien, lo agregué como edición a la respuesta original :)
Sojan V Jose
¿Por qué la respuesta redundante @Sojan?
nitinr708
@ nitinr708 2014. Apenas recuerdo: P. La respuesta original fue editada más tarde, algo que supongo.
Sojan V Jose
2

Suponiendo un shell interactivo, y desea mantener su historial de comandos actual y también cargar / etc / profile (que carga datos del entorno que incluyen / etc / bashrc y en Mac OS X carga rutas definidas en /etc/paths.d/ a través de path_helper), agregue su historial de comandos y haga un exec de bash con la opción de inicio de sesión ('-l'):

history -a && exec bash -l
beattidp
fuente
1

Esto también funcionará ...

cd ~
source .bashrc
kirti
fuente
77
Lo hace, pero también cambia el directorio de trabajo a ~, que no se desea.
Albin
1
Gracias por mantener vivo el contexto @Krinkle
nitinr708
¿Es necesario especificar ~cambiar el directorio de trabajo al directorio de inicio del usuario?
Kenly
1

Noté que el exec bashcomando puro preservará las variables de entorno, por lo que debe usarexec -c bash para ejecutar bash en un entorno vacío.

Por ejemplo, inicia sesión en un bash y export A=1, si usted exec bash, elA == 1 .

Si exec -cl bash,A está vacío.

Creo que esta es la mejor manera de hacer tu trabajo.

Gato perro
fuente
-2

yo personalmente tengo

alias ..='source ~/.bashrc'

en mi bashrc, para que pueda usar ".." para recargarlo.

Flo
fuente
44
Muchas personas lo usan ..como un alias cd .., por lo que será muy confuso.
El padrino
excepto por el nombre del alias, una buena idea. alias rehash='source ~/.bashrc'Es mi elección.
Frank Nocke
uso algo como "_rs" que utilizo para recargar shell. uso bastante _ para empezar mis alias; que es similar a js libs underscorejs o lodash.
Jimmy MG Lim