如何在不注销并重新登录的情况下重新加载.bashrc?


Answers:


2631

您只需要输入命令:

source ~/.bashrc

或者您可以使用命令的较短版本:

. ~/.bashrc

88
这与登录和注销完全不同。假设您在.bashrc:中有以下行export PATH=$PATH:foo,然后将其更改为export PATH=$PATH:bar。如果你登录并退了出去,只bar将在PATH,但如果你有什么建议,都foobar将在PATH。您知道解决这个问题的方法吗?
HighCommander13年

7
@ HighCommander4-一种非常不令人满意的方法是执行“ bash -l”,但这实际上会创建一个新的子shell,并且当您注销时,您将返回到封闭的shell,其中“ foo”仍在PATH中。如果您只对PATH感兴趣,则可以“取消设置PATH”并从头开始重建它,但是可能更容易/更安全的方法是在采购.bashrc之前执行“ PATH = / bin:/ usr / bin”。实际上,如何在登录时建立PATH变量是相当复杂的,至少涉及登录(请参阅“ man登录”)和/ etc / profile(请参见“ man bash”)中的输入。
乔治·霍金斯2013年

2
@Alex您可以通过将〜/ .bashrc行添加到〜/ .bash_profile中来自动执行此操作,尽管我不知道这是否是一个好习惯。
Vivek Gani

4
我还建议创建一个别名(您可以将其存储在〜/ .bashrc或〜/ .bash_aliases中),该别名将打开.bashrc,并在编辑器退出后重新加载它。您可以通过两个命令别名,像这样结合,例如做(如果Vim是您首选的编辑器,否则换出来给别的东西)alias editbashrc='vim ~/.bashrc; source ~/.bashrc'。这将使编辑更加顺畅,因为如果使用自定义别名,则在进行编辑后无需考虑重新加载。
塞缪尔·兰帕

6
它会影响当前终端。
matepal297

283

或者您可以使用:

exec bash

这做同样的事情,并且更容易记住(至少对我而言)。

exec命令通过运行指定的命令行来完全替换Shell进程。在我们的示例中,它将用bash(更新的配置文件)的新实例替换当前外壳程序。


13
您能解释一下source .bashrc命令和的区别exec bash吗?
muradin

18
@muradin source是一个内置的shell命令,它在当前shell中执行作为参数传递的文件的内容。因此,在您的示例中,它在当前shell中执行.bashrc文件。然后,exec命令用给定程序替换外壳,在您的示例中,命令用bash替换外壳(使用更新的配置文件)
WhoSayIn 2014年

3
在我的特例情况下,这完全动摇了。我的Dockerfile执行一个修改.bashrc的安装脚本。然后,我需要重新加载该文件,但是. ~/.bashrc它将在dash而不是中执行bash,因此会出现一个错误,因为shopt丢失了。source从外壳中找不到,所以解决方案也出来了。我尝试了这一点,并顺利构建了docker映像!
m59 2015年

9
优雅,但“做同一件事”并不完全正确。source ~/.bashrc将保留您的整个外壳环境(尽管可能会通过的供应源进行修改~/.bashrc),而exec bash将仅保留当前外壳的环境变量(就外壳变量,功能,选项而言,对当前外壳的任何临时更改都将丢失)。根据您的需求,一种或另一种方法可能是首选。
mklement0

12
@SEoF,当您说“ bash inception”时,如果您在考虑我认为的想法,我必须说您错了。与电影不同,重复播放时,您不会继续从bash变成bash exec bash。该exec命令 shell 替换为程序,在本例中为bash。因此,终端中始终存在一个bash实例。
约翰·雷德

121

为了补充和对比两个最受欢迎的答案,. ~/.bashrc以及exec bash

两种解决方案都可以有效地重新加载~/.bashrc,但是存在差异:

  • . ~/.bashrcsource ~/.bashrc保留您当前的shell

    • 除了修饰重装~/.bashrc到当前壳(采购)使得,当前壳和它的状态保存,包括环境变量,shell变量,shell选项,外壳的功能,和命令历史记录。
  • exec bash,或更确切地说,是exec "$BASH"[1],它将用一个新实例替换当前的shell,因此保留当前shell的环境变量(包括您自定义的变量)。

    • 换句话说:就外壳变量,外壳函数,外壳选项,命令历史而言,对当前外壳的任何临时更改都将丢失。

根据您的需求,一种或另一种方法可能是首选。


[1] exec bash从理论上讲,可以执行 bash启动当前外壳程序不同的可执行文件,前提是该文件恰好存在于之前列出的目录中$PATH。由于特殊变量$BASH始终包含启动当前外壳程序的可执行文件的完整路径,exec "$BASH"因此请确保使用相同的可执行文件。
的说明重新"..."周围$BASH:双引号确保变量值被照原样使用,而不被解释击; 如果该值没有嵌入的空格或其他shell元字符(在这种情况下不太可能),则您不一定严格要求双引号,但是使用它们是一种好习惯。


在我问之前,你回答了我的问题。很高兴知道;我经常将CLASSPATH设置为一个会话。
swinefish '16

因此,即使我将exec称为“ $ BASH”,也会在接下来打开的shell中找到.bashrc设置的变量(使用与当前会话相同的可执行文件)?
nitinr708

2
@ nitinr708:是的,exec $BASH将使用source ~/.bashrc,因此您将在新会话中看到其对shell环境的更改。
mklement0 '17

@ Gaming32,我很欣赏超链接脚注的想法,但实际上并没有用(在回答这个问题的过程中,它并不那么重要)。
mklement0

44

有人编辑了我的答案以添加不正确的英语,但这是原始答案,不如被接受的答案。

. .bashrc

25
仅当您的当前目录实际上是您的主目录时,这才起作用。以下将起作用:〜/ .bashrc
Brian Showalter 2010年

6
是什么使这项工作?当我执行“ .bashrc”时,实际上发生了什么?谢谢!
杰德·丹尼尔斯

54
。是“源”内置命令的BASH快捷方式。因此,“。bashrc”与BASH解释器的“源.bashrc”相同。
Brian Showalter 2010年

7
凉。谢谢。现在我不知道了。
杰德·丹尼尔斯

2
我刚刚提交了一个add的编辑请求~/,但是由于最上面的答案同时显示了两者source ~/.bashrc,因此. ~/.bashrc我想知道是否应该仅将这个答案作为多余的内容删除。
Max Ghenis '16

18

根据您的环境,只需键入

bash

可能也可以。


15
但是,这将在当前外壳中调用新外壳,从而浪费资源。更好地使用@WhoSayln的exec解决方案,该解决方案当前的shell 替换为新调用的shell。
Bernhard Wagner

是的,只是使用源代码。这完全是不必要和烦人的。
dylnmc 2014年


这是一个很好的解决方案,可以限制用户特权访问。
Tunde Pizzle

调用子流程会增加一层没有附加价值的复杂性。
艾伦·贝雷津

18

有了这个,你不会甚至要输入“源〜/ .bashrc中”:

包括您的bashrc文件:

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

每次您要编辑bashrc时,只需运行别名“ rc



5

根据您的环境,您可能需要添加脚本以在打开SSH会话时自动加载.bashrc。我最近迁移到了运行Ubuntu的服务器,默认情况下加载的是.profile,而不是.bashrc或.bash_profile。要在.bashrc中运行任何脚本,source ~/.bashrc每次打开会话时都必须运行,这在运行远程部署时无济于事。

要在打开会话时自动加载.bashrc,请尝试将其添加到.profile中:

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

重新打开会话,它将加载.bashrc中的所有路径/脚本。


我在“ .profile”中有此文件,但是它不起作用-每次退出时,我都必须手工完成。有什么建议么?
韦恩·斯玛特曼

4

我使用easyengine设置了基于vultr云的服务器。
我在找到了bash文件/etc/bash.bashrc

所以 source /etc/bash.bashrc奏效了我!

更新

设置裸服务器(ubuntu 16.04)时,如果尚未设置用户名并通过root登录,则可以使用上述信息。

最好创建一个用户(具有sudo privledges),然后以该用户名登录。
这将为您的设置创建一个目录,包括.profile和.bashrc文件。
https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/

现在,您将编辑和(并“来源”) ~/.bashrc文件。

在我的服务器上,它位于/home/your_username/.bashrc
your_username实际上是您在上面创建的新用户名,现在使用来登录)


4

exec bash是重新执行并启动新Shell来替换当前外壳的好方法。只是为了增加答案,$ SHELL返回当前的shell,即bash。通过使用以下命令,它将重新加载当前的shell,而不仅是bash。

exec $SHELL -l;



3

类型:

source ~/.bashrc

或者,简称:

. ~/.bashrc


1
同样,仅当您位于主目录(或更确切地说,位于所在目录)中时,此选项才有效.bashrc。如公认的答案所述,更正确的方法是source ~/.bashrc
约翰·雷德

2

我在msysgit上使用以下命令

. ~/.bashrc

的短版

source ~/.bashrc

@jwg接受的答案是。.bashrc。仅当您位于msysgit上的主目录中时,它才有效。
Sojan V Jose 2014年

@jwg好的,我很想提到您不必键入'source〜/ .bashrc'而是使用较短的版本。
Sojan V Jose 2014年

@jwg好吧,我将其添加为原始答案的编辑内容:)
Sojan V Jose

为什么多余的答案@Sojan?
nitinr708

@ nitinr708 2014年。我几乎不记得:P。原来的答案后来被编辑,我猜是这样。
Sojan V Jose

2

假设使用交互式外壳程序,并且您想保留当前命令历史记录,并还要加载/ etc / profile(它加载包括/ etc / bashrc在内的环境数据,而在Mac OS X上则通过/etc/paths.d/定义了路径) path_helper),附加您的命令历史记录,并使用login('-l')选项执行bash的exec:

history -a && exec bash -l

1

这也将起作用。

cd ~
source .bashrc

7
可以,但是也可以将工作目录更改为〜,这是不需要的。
Albin 2014年

1
感谢您让上下文保持活动状态@Krinkle
nitinr708 '17

是否需要指定~将工作目录更改为用户主目录?
肯利,

1

我注意到那纯 exec bash命令将保留环境变量,因此您需要使用exec -c bash它在空环境中运行bash。

例如,您登录bash export A=1,如果您登录,exec bashA == 1

如果你 exec -cl bashA是空的。

我认为这是完成工作的最佳方法。


-2

我个人有

alias ..='source ~/.bashrc'

在我的bashrc中,这样我就可以使用“ ..”来重新加载它了。


4
许多人将..用作的别名cd ..,因此会造成混乱。
教父

除了别名是个好主意。alias rehash='source ~/.bashrc'是我的选择。
Frank Nocke '18

使用类似“ _rs”的东西,我用它作为重载外壳。我几乎使用_作为别名的开头;这类似于js libs underscorejs或lodash。
Jimmy MG Lim,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.