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

Jed*_*els 1510 bash terminal profile reload

如果我进行了更改.bashrc,如何在不注销并重新登录的情况下重新加载?

Geo*_*ins 2438

您只需输入命令:

source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

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

. ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

  • 这与登录和退出不完全相同.假设你在.bashrc中有以下行:`export PATH = $ PATH:foo`,然后你将它改为`export PATH = $ PATH:bar`.如果您登录和退出,只有`bar`将在PATH中,但如果你按照你的建议行事,`foo`和`bar`都将在PATH中.你知道解决这个问题的方法吗? (81认同)
  • @ HighCommander4 - 一种非常不令人满意的方式来做你想做的事情就是做"bash -l"但是这实际上创建了一个新的子shell,当你注销时,你将返回到封闭的shell,其中"foo"仍在PATH中.如果您只对PATH感兴趣,可以"取消设置PATH"并从头开始重构,但在获取.bashrc之前,可能更容易/更安全的做法是"PATH =/bin:/ usr/bin".如何在登录时建立PATH变量实际上相当复杂,至少包括从登录(参见"man login")和/ etc/profile(参见"man bash")的输入. (7认同)
  • 它将影响**仅**当前终端. (6认同)
  • 我还建议创建一个别名(可以存储在〜/ .bashrc或〜/ .bash_aliases中),打开.bashrc,并在编辑器退出后重新加载它.您可以通过在别名中组合两个命令来实现,例如像这样(如果vim是您首选的编辑器,否则将其换成其他东西):```alias editbashrc ='vim~/.bashrc; source~/.bashrc'```.这将使编辑更加顺畅,因为在进行编辑之后,如果使用自定义别名,则无需考虑重新加载. (4认同)
  • @Alex你可以通过在〜/ .bash_profile中添加〜/ .bashrc行来自动化它,虽然我不知道这是不是一个好习惯. (2认同)
  • 我认为下面来自 @WhoSayIn 的答案应该优先于这个,以防止上面讨论的 PATH 问题:`exec bash` (2认同)

Who*_*yIn 252

或者你可以使用;

exec bash
Run Code Online (Sandbox Code Playgroud)

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

exec命令用给定的程序替换shell,在我们的例子中,它用bash替换我们的shell(使用更新的配置文件)

  • @muradin,`source`是一个内置的shell命令,它执行在当前shell_中作为参数传递的文件的内容.所以在你的例子中,它在当前shell中执行.bashrc文件.并且`exec`命令用给定的程序替换shell,在你的例子中,它用bash替换你的shell(用更新的配置文件) (16认同)
  • @SEoF,当你说"bash inception"时,如果你在思考我认为你在想什么,我必须说你错了.与电影不同,当你反复做'exec bash`时,你不会继续从bash进入bash.`exec`命令*用程序替换*shell,在我们的例子中是bash.因此,终端中总会存在一个bash实例. (12认同)
  • 你能解释一下`source .bashrc`命令和`exec bash`的区别吗? (10认同)
  • 优雅,但"做同样的事情"并不完全正确.`source~/.bashrc`将保留你的_entire_ shell环境(尽管可能通过'〜/ .bashrc`的来源修改),而`exec bash`只会保留你当前shell的_environment变量_(任何临时更改到当前shell的shell变量,函数,选项都丢失了).根据您的需要,可能首选一种或另一种方法. (8认同)
  • 那个在CentOS上为我工作,谢谢. (4认同)
  • 在我特有的超级环境中,这完全是震撼人心的.我的Dockerfile执行一个修改.bashrc的安装脚本.然后我需要重新加载,但是`.〜/ .bashrc`将在`dash`而不是`bash`中执行,因此会出现错误,因为缺少`shopt`.在shell中找不到`source`,所以解决方案也没有.我试过这个并且码头图像构建得很顺利! (3认同)
  • 这很好,特别是因为bashrc可以在`/ etc`或`/ home`目录中更新,我们不需要关心这个. (2认同)
  • 这适用于我的Cygwin + win7.谢谢!键入此更快,键入.在〜/ .bashrc (2认同)

mkl*_*nt0 114

为了补充和对比两个最流行的答案,. ~/.bashrc并且exec bash:

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

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

    • 不同的是重新加载修改~/.bashrc到当前壳(采购)使得,当前壳和它的状态保存,包括环境变量,shell变量,shell选项,外壳的功能,和命令历史记录.
  • exec bash或者,更健壮的exec "$BASH"[1],将新实例替换当前的shell,因此保留当前shell的环境变量(包括你自己定义的那些).

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

根据您的需要,可能首选一种或另一种方法.


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

  • @ nitinr708:是的,`exec $ BASH`将来源`〜/ .bashrc`,所以你会在新会话中看到它对shell环境的改变. (2认同)

Ran*_*tor 45

有人编辑我的答案添加错误的英语,但这是原始的,这不如接受的答案.

. .bashrc
Run Code Online (Sandbox Code Playgroud)

  • .是"源"内置命令的BASH快捷方式.因此".bashrc"与BASH解释器的"source .bashrc"相同. (54认同)
  • 这仅在您当前目录实际上是您的主目录时才有效.以下将起作用:.在〜/ .bashrc (25认同)
  • 凉.谢谢.现在我不知道. (7认同)
  • 是什么让这项工作?当我做".bashrc"时实际发生了什么?谢谢! (6认同)
  • 我刚刚提交了一个编辑请求来添加`〜/`,但由于最顶层的答案显示了`source~/.bashrc`和`.〜/ .bashrc`我想知道这个答案是否应该被删除为冗余. (2认同)

Jam*_*mes 18

根据您的环境,只需输入

bash
Run Code Online (Sandbox Code Playgroud)

也可以工作.

  • 但是,这将在当前的shell中调用新shell,从而浪费资源.更好地使用@ WhoSayln的[exec](http://www.gnu.org/software/bash/manual/bashref.html#index-exec)解决方案**用新调用的**替换**当前shell. (15认同)

Roy*_*Lin 16

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

包括你的bashrc文件:

alias rc="vim ~/.bashrc && source ~/.bashrc"
Run Code Online (Sandbox Code Playgroud)

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


Geo*_*ale 13

. ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

. 是POSIX强制内置的


备择方案

source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

source.bash中dot/period的同义词,但在POSIX sh中不是,所以为了获得最大的兼容性,请使用句点.

exec bash
Run Code Online (Sandbox Code Playgroud)
  • exec命令给定的程序替换shell ... - WhoSayIn

  • exec bash仍然继承当前shell的环境。exec env -i bash会更近一些(如果您当前在登录shell中,则是exec env -i bash -l)。 (2认同)

She*_*man 10

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

source /etc/bash.bashrc这招对我来说也是如此!

更新

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

最好创建一个用户(具有 sudo 权限),然后以此用户名登录。
这将为您的设置创建一个目录,包括上一个资源中所述的文件.profile.bashrc

现在,您将编辑 和 (和source)~/.bashrc文件。

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


Jim*_*Lim 7

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

exec $SHELL -l;


kar*_*lus 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
Run Code Online (Sandbox Code Playgroud)

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