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

2164

如果我修改了.bashrc文件,如何在不注销并重新登录的情况下重新加载它?

18个回答

4

当我改变PATH时,对我有效的方法是:exec "$BASH" --login


这个问题是关于重新加载~/.bashrc的,使用--login选项将 不会 (直接)重新加载;在用户级别上,它将重新加载~/.bash_profile(或~/.bash_login~/.profile)。 - mklement0

2

注意$SHELL可能会产生意外的结果,例如在Docker环境中连接时。

echo $SHELL
/usr/sbin/nologin

所以如果你尝试,你将会被断开连接

exec $SHELL
This account is currently not available.

所以你可能需要使用更复杂的内容,比如

exec $(pgrep -l sh | grep "^`echo $$` " | cut -d" " -f2)

假设每个 shell 都包含 "sh",并且这个命令管道

pgrep -l sh | grep "^`echo $$` " | cut -d" " -f2

生成完整的命令
如果您有参数或标志,您可能需要使用-f2,3,4 或尝试

pgrep -l sh | grep "^`echo $$` " | sed -E 's/^[0-9]+ //'

但是请阅读上面的所有建议
个人而言,我不喜欢丢失Shell历史记录...但这取决于您和您的需求


2
我在 MsysGit 上使用以下命令:
. ~/.bashrc

缩写版的

source ~/.bashrc

@jwg 接受的答案是 .bashrc 。只有在 msysgit 的主目录中才能起作用。 - Sojan Jose

2

我理解您想要在注销并重新登录后拥有一个shell。我认为最好的实现方式是:

exec env -i HOME="$HOME" "$SHELL" -l

exec 会替换当前的shell,因此当新的shell退出时,你不会留下它。 env 将创建一个新的空环境,使用 -i 我们添加了 $HOME,这样你的shell(通常是bash)可以找到 ~/.profile/~/.bash_profile(在ubuntu上或者指定的情况下还有~/.bashrc)。由于 -l,这些文件将被引用。但我并不完全确定。


这在撤销conda init时非常有效,特别是在交互式LSF任务中(您不想仅为了一个干净的shell而在LSF队列中等待时)。 - jan-glx

2

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

history -a && exec bash -l

1
我注意到纯粹的exec bash命令将保留环境变量,因此您需要使用exec -c bash以在空环境中运行bash。
例如,您登录bash,并export A=1,如果您exec bash,则A == 1
如果您exec -cl bashA为空。
我认为这是完成工作的最佳方式。

exec -cexec -cl 是一样的吗? - i_want_more_edits

0

这样也可以运行。

cd ~
source .bashrc

12
它确实会这样做,但它还会把工作目录改变到“〜”,这是不希望的。 - Albin
更改工作目录到用户主目录是否需要指定~ - Kenly

0
我编写了一组脚本,称之为bash_magic,可以在多个shell中自动化此过程。如果您在bash magic shell目录(默认为.bash.d)中更新了一个shell文件,则它将在下一个提示符处自动源更新。因此,一旦您进行更改,只需按下Enter/return键,任何更新都将被源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接