如果我对.bashrc进行了更改,如何在不注销和重新登录的情况下重新加载它?
您只需输入命令:
或者可以使用较短版本的命令:
- 每次我打开终端时,我似乎都要这样做…有没有自动化的方法?
- 这与登录和退出不完全相同。假设您在.bashrc中有以下行:export PATH=$PATH:foo,然后将其更改为export PATH=$PATH:bar。如果您登录和退出,只有bar会在路径中,但是如果您按照您的建议执行,foo和bar都会在路径中。你知道怎么解决这个问题吗?
- 那是什么"命令"?我做了"人的命令",但它没有关于它的信息。搜索也没有提供任何信息yandex.com/yandsearch?text=linux+man+source&lr=87。这是命令吗?
- @gekannt-如果你输入source,你会发现source不是一个普通的命令,而是一个"shell内置的"-这意味着你在文件系统的某个地方找不到它的可执行文件,比如在/usr/bin中,而是作为shell的一部分来实现。因此,如果您执行"man bash"并搜索"shell builtin commands"部分,然后搜索"source",您将找到一个关于source执行什么操作的很好解释(如果您也了解fork,那么应该清楚为什么source是内置的而不是命令)。
- @highcommander4-一个非常不令人满意的方式来做你想做的事情是"bash-l",但是这实际上创建了一个新的子shell,当你注销时,你将返回到封闭shell,其中"foo"仍然在路径中。如果您只是对path感兴趣,可以执行"unset path"并从头重建它,但可能更简单/更安全的做法是在源代码为.bashrc之前执行"path=/bin:/usr/bin"。在登录时如何构建路径变量实际上相当复杂,至少涉及登录时的输入(参见"man login")和/etc/profile(参见"man bash")。
- @亚历克斯,你可以通过在~/.bashrc配置文件中添加行~/.bashrc来实现自动化,尽管我不知道这是否是一个好的实践。
- 我还建议创建一个打开.bashrc的别名(可以存储在~/.bashrc或~/.bash_别名中),并在编辑器退出后重新加载它。您可以通过在一个别名中组合两个命令来实现这一点,例如so(如果vim是您首选的编辑器,否则将其换成其他的编辑器):alias editbashrc='vim ~/.bashrc; source ~/.bashrc'。这将使编辑更加顺畅,因为在进行编辑之后,如果使用自定义别名,您不需要考虑重新加载。
- 它只影响当前终端。
- 我使用这个别名为所有用户编辑bashrc:alias bashrc="sudo nano/etc/bash.bashrc;source/etc/bash.bashrc"
- 我认为下面来自@whosayin的答案应该优先于此,以防止上面讨论的路径问题:exec bash。
或者你可以使用;
做同样的事。(而且更容易记住,至少对我来说)
exec命令用给定的程序替换shell,在我们的示例中,它用bash替换shell(用更新的配置文件)。
- 那个在Centos为我工作的,谢谢。
- 我觉得这个是最优雅的。
- 巴什开始…
- 你能解释一下source .bashrc命令和exec bash命令的区别吗?
- @muradin,source是一个内置的shell命令,它执行当前shell中作为参数传递的文件的内容。所以在您的示例中,它在当前shell中执行.bashrc文件。而exec命令将shell替换为给定的程序,在您的示例中,它将shell替换为bash(用更新的配置文件)。
- 这很好,特别是因为bashrc可以在/etc或/home目录中更新,我们不需要关心这个问题。
- 在我超特殊的情况下,这完全是一个震撼。我的dockerfile执行一个修改.bashrc的安装脚本。然后我需要重新加载,但是. ~/.bashrc将在dash而不是bash中执行,因此有一个错误,因为shopt丢失了。从外壳上找不到source,所以解决方案也就出来了。我试过了,码头工人的形象建立得很顺利!
- 对于centos7和helper bash配置,这是最有用的。执行. ~/.bashrc操作没有重新加载我的自定义别名文件。
- 优雅,但"做同样的事"并不完全正确。source ~/.bashrc将保护您的整个shell环境(虽然可能通过~/.bashrc的来源进行了修改),而exec bash将只保护您当前shell的环境变量(在shell变量、函数、选项方面对当前shell的任何特殊更改都将丢失)。根据您的需要,可以选择一种或另一种方法。
- @mklement0,感谢您提供详细信息。这个解决方案在许多情况下都可以工作,但我想您可能需要在您提到的情况下使用-source。
- @SEOF,当你说"bash inception"时,如果你在想我认为你在想的,我必须说你错了。与电影不同的是,当你反复做exec bash时,你不会一直从bash进入bash。在我们的例子中,exec命令用程序bash替换shell。所以,在终端中总是存在bash的一个实例。
- 上面提到的一些惊喜@mklement0的具体例子:您的pushd/popd目录堆栈将被删除(除了cwd),您的PS1提示将被重置。有些dev环境,比如python的virtualenv/venv,会改变PATH和其他变量,并在PS1提示符中输入活动环境的名称。在exec bash之后,环境变量仍然处于活动状态,但PS1提示中的视觉指示器消失。此外,像deactivate这样的清理功能已经消失。
- 这适用于我的cygwin+win7。谢谢!打字速度比打字快。BASHC
- 在当前会话中运行"exec bash"后,这是否适用于我打开的另一个会话?
为了补充和对比两个最流行的答案,. ~/.bashrc和exec bash:
这两种解决方案都能有效地重新加载~/.bashrc,但存在差异:
根据您的需要,可以选择一种或另一种方法。
[1]exec bash理论上可以执行不同于启动当前shell的bash可执行文件,前提是它恰好存在于$PATH中前面列出的目录中。由于特殊变量$BASH总是包含启动当前shell的可执行文件的完整路径,因此exec"$BASH"保证使用相同的可执行文件。关于$BASH的注释:双引号确保变量值按原样使用,而不需要bash解释;如果值没有嵌入空格或其他shell元字符(在这种情况下不太可能),则不需要严格使用双引号,但使用双引号是一个很好的习惯。
- 我还没来得及问,你就回答了我的问题。这很好知道;我经常为一个会话设置类路径。
- 所以,即使我调用exec"$bash",下一次打开的shell中也会找到.bashrc集的变量(使用与当前会话相同的可执行文件)?
- @Nitinr708:是的,exec $BASH将源于~/.bashrc,因此您将在新的会话中看到它对shell环境的更改。
- @gaming32,我很欣赏一个超链接脚注的想法,但实际上它没有起作用(在一个简短的答案中,它并不那么重要)。
有人编辑了我的答案,添加了不正确的英语,但这里是原文,这比公认的答案差。
- 只有当当前目录实际上是主目录时,这才有效。以下内容有效:。BASHC
- 是什么让这个工作?当我这样做的时候,实际上发生了什么。BASHC?谢谢!
- . 是"source"内置命令的bash快捷方式。所以。.bashrc"与bash解释器的"source.bashrc"相同。
- 酷。谢谢。现在我不知道了。
- 我刚刚提交了一个添加~/的编辑请求,但是由于顶部的答案显示source ~/.bashrc和. ~/.bashrc,我想知道是否应该将此答案作为冗余删除。
- 不清楚你在回答什么…我们需要更多的点…
- @兰迪普洛克托:虽然你指出你的答案比公认的答案差是值得称赞的,但是如果你简单地删除它,它会更好,因为它不仅明显地比公认的答案差(因为只有在当前目录下才有效)。恰巧是当前用户的home dir.,如前所述),但相反,没有添加任何感兴趣的内容。
根据您的环境,只需键入
也可以工作。
- 然而,这将在当前shell中调用一个新的shell,从而浪费资源。最好使用@whosayln的exec解决方案,该解决方案将当前shell替换为新调用的shell。
- 是的,只要使用来源。这是完全不必要和令人讨厌的。
- 除了@bernhardwagner的评论之外,如果您生成了一个新的外壳,那么您还将释放当前的bash历史。
- 这是限制用户权限访问的好解决方案。
有了这个,您甚至不必键入"source~/.bashrc":
包括您的bashrc文件:
1
| alias rc="vim ~/.bashrc && source ~/.bashrc" |
每次你想编辑你的bashrc,只需运行别名"rc"
. is a POSIX-mandated builtin
选择
source is a synonym for dot/period . in bash, but not in POSIX sh, so for maximum compatibility use the period.
-
exec command replaces the shell with a given program... – WhoSayIn
- exec bash仍然继承了当前shell的环境。如果您当前处于登录shell中,exec env -i bash将更接近(或exec env -i bash -l)。
根据您的环境,您可能希望在打开ssh会话时添加脚本以自动加载.bashrc。我最近迁移到一个运行Ubuntu的服务器上,默认情况下会加载.profile,而不是.bashrc或.bash_profile。要在.bashrc中运行任何脚本,我必须在每次打开会话时运行source ~/.bashrc,这在运行远程部署时没有帮助。
若要在打开会话时自动加载.bashrc,请尝试将其添加到.profile:
1 2 3 4 5 6
| if [ -n"$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f"$HOME/.bashrc" ]; then
."$HOME/.bashrc"
fi
fi |
重新打开您的会话,它应该加载您在.bashrc中拥有的任何路径/脚本。
对我来说,当我改变道路时,能起作用的是:exec"$BASH" --login。
- 这也是我的工作,非常感谢:)
- 问题是重新加载~/.bashrc,--login不会(直接)重新加载;在用户级别,它将重新加载~/.bash_profile(或~/.bash_login或~/.profile。
我使用easyengine设置了我的vultr基于云的服务器。我在/etc/bash.bashrc找到了我的bash文件。
所以以东克十一〔一〕给了我诡计!
更新
当设置一个裸机服务器(Ubuntu16.04)时,您可以使用上面的信息,当您还没有设置用户名,并且通过根用户登录时。
最好创建一个用户(具有sudo特权),然后以这个用户名登录。这将为您的设置创建一个目录,包括.profile和.bashrc文件。https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/
现在,您将编辑和(和"源")~/.bashrc文件。
在我的服务器上,它位于/home/your_username/.bashrc(其中your_username实际上是您在上面创建的新用户名,现在使用登录)
类型:
source ~/.bashrc
或者,以较短的形式:
. ~/.bashrc
- 同样,只有在主目录中,或者更准确地说,在.bashrc所在的目录中,才能工作。一个更正确的方法是,按照公认的答案,使用source ~/.bashrc。
假设有一个交互式shell,您希望保留当前的命令历史记录,并加载/etc/profile(它加载环境数据,包括/etc/bashrc,在mac os x上加载在/etc/paths.d/中定义的路径,通过path_helper),附加您的命令历史记录并使用login("-l")选项执行bash:
1
| history -a && exec bash -l |
我注意到pure exec bash命令将保留环境变量,因此需要使用exec -c bash在空环境中运行bash。
例如,登录bash和export A=1,如果您是exec bash和A == 1。
如果你是exec -cl bash,A是空的。
我认为这是完成你工作的最好方法。
这也可以。
- 确实如此,但它还将工作目录更改为~,这是不需要的。
- 感谢您在克里克让上下文保持活跃
- 是否需要指定~将工作目录更改为用户主目录?
我在msysgit上使用以下命令
较短版本的
- 这已经是公认的答案4年了?
- @JWG接受的答案是。BASHC。只有在msysgit的主目录中才能工作。
- @jwg ok i thin我曾提到,您不必键入'source~/.bashrc',而是使用较短的版本。
- @JWG好吧,我把它作为编辑添加到了原始答案中:)
- 为什么在索扬有多余的答案?
- @Nitinr708 2014年。我几乎不记得了:P。最初的答案后来被编辑了,我猜是这样的。
我个人有
alias ..='source ~/.bashrc'
在我的bashrc中,这样我就可以使用"…"来重新加载它。
- 很多人用..作为cd ..的别名,所以这会很混乱。
- 除了化名,这是个好主意。我的选择是alias rehash='source ~/.bashrc'。