如何在不注销并重新登录的情况下重新加载 .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 中,但如果您按照您的建议进行操作,foo
和 bar
都将在 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】:
补充和对比两个最受欢迎的答案,. ~/.bashrc
和 exec bash
:
两种解决方案有效重新加载~/.bashrc
,但有区别:
. ~/.bashrc
或 source ~/.bashrc
将保留您当前的 shell 会话:
~/.bashrc
重新加载到当前 shell (sourcing) 所做的修改之外,当前 shell 进程及其状态被保留,其中包括环境变量、shell 变量、shell 选项、shell 函数和命令历史记录。
exec bash
,或者更确切地说,exec "$BASH"
[1],
将替换您当前的 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 bash
,A
为空。
我认为这是完成工作的最佳方式。
【讨论】:
【参考方案16】:这也可以..
cd ~
source .bashrc
【讨论】:
确实如此,但它也将工作目录更改为 ~,这是不想要的。 感谢您保持上下文的活力@Krinkle 是否需要指定~
才能将工作目录更改为用户主目录?【参考方案17】:
我编写了一组名为bash_magic 的脚本,可以跨多个shell 自动执行此过程。如果您更新 bash 魔法 shell 目录(默认为.bash.d
)中的 shell 文件,它将在下一个提示符下自动获取更新。因此,一旦您进行了更改,只需点击Enter
/return
键,任何更新都将获得。
【讨论】:
以上是关于如何在不注销并重新登录的情况下重新加载 .bashrc 设置?的主要内容,如果未能解决你的问题,请参考以下文章
以其他用户身份登录后,如何在不退出并重新登录 laravel 7 的情况下返回我的帐户
使用 Ionic 框架在登录/注销时清除历史记录并重新加载页面
WKWebView 在不重新加载页面的情况下评估 Javascript