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

Posted

技术标签:

【中文标题】如何在不注销并重新登录的情况下重新加载 .bashrc 设置?【英文标题】:How to reload .bashrc settings without logging out and back in again? 【发布时间】:2011-01-31 20:47:36 【问题描述】:

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

【问题讨论】:

【参考方案1】:

可以输入长格式命令:

source ~/.bashrc

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

. ~/.bashrc

【讨论】:

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

或者你可以使用:

exec bash

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

exec 命令通过运行指定的命令行完全替代了 shell 进程。在我们的示例中,它会用 bash 的新实例(使用更新的配置文件)替换当前的 shell。

【讨论】:

你能解释一下source .bashrc命令和exec bash的区别吗? @muradin, source 是一个内置的 shell 命令,它执行作为参数传递的文件内容,在当前 shell 中。因此,在您的示例中,它在当前 shell 中执行 .bashrc 文件。 exec 命令用给定的程序替换 shell,在你的例子中,它用 bash 替换你的 shell(使用更新的配置文件) 在我的超具体情况下,这完全震撼了。我的 Dockerfile 执行修改 .bashrc 的安装脚本。然后我需要重新加载它,但. ~/.bashrc 将在dash 而不是bash 中执行,因此会出现错误,因为缺少shopt。在 shell 中找不到 source,因此该解决方案也已失效。我试过了,docker镜像构建得很顺利! 优雅,但“做同样的事情”并不完全正确。 source ~/.bashrc 将保留您的整个 shell 环境(尽管可能已被~/.bashrc 的来源修改),而exec bash 将仅保留您当前shell 的环境变量(任何在 shell 变量、函数、选项方面对当前 shell 的临时更改会丢失)。根据您的需要,可能首选一种或另一种方法。 @SEoF,当你说“bash inception”时,如果你在想我认为你在想的,我必须说你错了。与电影不同的是,当您反复执行exec bash 时,您不会继续从 bash 进入 bash。 exec 命令用程序替换 shell,在我们的例子中是 bash。因此,终端中始终存在一个 bash 实例。【参考方案3】:

补充和对比两个最受欢迎的答案,. ~/.bashrcexec bash

两种解决方案有效重新加载~/.bashrc,但有区别:

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

除了将 ~/.bashrc 重新加载到当前 shell (sourcing) 所做的修改之外,当前 shell 进程及其状态保留,其中包括环境变量、shell 变量、shell 选项、shell 函数和命令历史记录。

exec bash,或者更确切地说,exec "$BASH"[1], 将替换您当前的 shell 为一个新实例,因此保留您当前 shell 的环境变量 (包括您定义的临时、会话中的)。

换句话说:对当前 shell 在 shell 变量、shell 函数、shell 选项、命令历史记录方面的任何临时更改都将丢失。

根据您的需要,可能首选其中一种方法。


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

【讨论】:

你在我问之前就回答了我的问题。很高兴知道这一点;我经常为单个会话设置我的 CLASSPATH。 所以即使我调用 exec "$BASH" 是否会在我接下来打开的 shell 中找到 .bashrc 设置的变量(使用与当前会话相同的可执行文件)? @nitinr708:是的,exec $BASH 将提供 ~/.bashrc,因此您将在新会话中看到它对 shell 环境的更改。 这就是我使用broadcast all + source 的原因。两全其美,imo。【参考方案4】:

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

. .bashrc

【讨论】:

这仅在您的当前目录实际上是您的主目录时才有效。以下将起作用:. ~/.bashrc 是什么让这个工作?当我执行“..bashrc”时实际发生了什么?谢谢! 。是“source”内置命令的 BASH 快捷方式。所以“..bashrc”对于 BASH 解释器来说与“source .bashrc”是一样的。 酷。谢谢。现在我不知道。 我刚刚提交了添加~/ 的编辑请求,但由于最上面的答案显示source ~/.bashrc. ~/.bashrc 我想知道是否应该将这个答案作为多余的删除。【参考方案5】:

有了这个,你不会甚至必须输入“source ~/.bashrc”:

包含您的 bashrc 文件:

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

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

【讨论】:

【参考方案6】:

根据您的环境,只需键入

bash

也可以。

【讨论】:

但是,这会在当前的 shell 中调用一个新的 shell,从而浪费资源。最好使用@WhoSayln 的exec 解决方案,它用新调用的shell 替换当前shell。 是的,只需使用源代码。这是完全没有必要和烦人的。 除了@BernhardWagner 的评论,如果你生成一个新的 shell,你也会丢失你当前的 bash 历史 这是一个很好的解决方案,可以限制用户权限访问。 调用子流程增加了一层复杂性,没有额外的价值。【参考方案7】:
. ~/.bashrc

. is a POSIX-mandated builtin


替代方案

source ~/.bashrc

source is a synonym for dot/period . in bash, but not in POSIX sh, so for maximum compatibility use the period.

exec bash
exec 命令 用给定的程序替换 shell... – WhoSayIn

【讨论】:

exec bash 仍然继承当前 shell 的环境。 exec env -i bash 会更近(或者 exec env -i bash -l 如果您当前在登录 shell 中)。【参考方案8】:

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

exec $SHELL -l;

【讨论】:

【参考方案9】:

根据您的环境,您可能希望添加脚本以在您打开 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”中有这个,但它不起作用——每次我退出时,我都必须手动完成。有什么建议吗?【参考方案10】:

类型:

source ~/.bashrc

或者,更短的形式:

. ~/.bashrc

【讨论】:

同样,仅当您位于主目录中时才有效,或者更准确地说,位于.bashrc 所在的目录中。正如接受的答案所述,更正确的方法是source ~/.bashrc【参考方案11】:

对我来说,更改 PATH 时有效的是:exec "$BASH" --login

【讨论】:

问题是关于重新加载~/.bashrc--login不会(直接)重新加载;在用户级别,它将重新加载 ~/.bash_profile(或 ~/.bash_login~/.profile)。【参考方案12】:

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

所以source /etc/bash.bashrc 为我成功了!

更新

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

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

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

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

【讨论】:

【参考方案13】:

我在 msysgit 上使用以下命令

. ~/.bashrc

短版

source ~/.bashrc

【讨论】:

@jwg 接受的答案是 . .bashrc 。仅当您位于 msysgit 的主目录中时才有效。 @jwg 好吧,我是说你不必输入'source ~/.bashrc',而是使用较短的版本。 @jwg 好的,我将其添加为对原始答案的编辑:) 为什么是多余的答案@Sojan? @nitinr708 2014 。我几乎不记得了:P。我猜原来的答案后来被编辑了。【参考方案14】:

假设是一个交互式 shell,并且您希望保留当前的命令历史记录并加载 /etc/profile(它加载环境数据,包括 /etc/bashrc 并且在 Mac OS X 上加载 /etc/paths 中定义的路径。 d/ 通过 path_helper),附加您的命令历史记录并使用登录('-l')选项执行 bash:

history -a && exec bash -l

【讨论】:

【参考方案15】:

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

例如,你登录一个 bash,export A=1,如果你是exec bash,则A == 1

如果你exec -cl bashA 为空。

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

【讨论】:

【参考方案16】:

这也可以..

cd ~
source .bashrc

【讨论】:

确实如此,但它也将工作目录更改为 ~,这是不想要的。 感谢您保持上下文的活力@Krinkle 是否需要指定~才能将工作目录更改为用户主目录?【参考方案17】:

我编写了一组名为bash_magic 的脚本,可以跨多个shell 自动执行此过程。如果您更新 bash 魔法 shell 目录(默认为.bash.d)中的 shell 文件,它将在下一个提示符下自动获取更新。因此,一旦您进行了更改,只需点击Enter/return 键,任何更新都将获得。

【讨论】:

以上是关于如何在不注销并重新登录的情况下重新加载 .bashrc 设置?的主要内容,如果未能解决你的问题,请参考以下文章

以其他用户身份登录后,如何在不退出并重新登录 laravel 7 的情况下返回我的帐户

如何在不刷新整个页面的情况下重新加载组件?

使用 Ionic 框架在登录/注销时清除历史记录并重新加载页面

WKWebView 在不重新加载页面的情况下评估 Javascript

如何在 Nest API iOS 中成功注销后重新加载登录页面

如何在不清除数据库的情况下重新加载 Roo 项目?