如何使用命令/脚本刷新所有bash shell?


8

每当我修改我的 .bashrc文件时,我都必须进入每个bash shell并再次获取它以实现更改。

有一个更好的方法吗?一些运行一次的命令会自动source ~/.bashrc在所有打开的bash shell中执行a 吗?

Answers:


6

不,我认为这是不可能的。也不应该。这基本上等于将代码注入到已经启动并处于活动状态的Shell中的方式,并且会构成重大的安全威胁。

许多守护进程设计做到这一点。典型的方法是向他们发送HUP(挂断)信号,这会使他们在重新读取其配置文件后重新启动。您可以通过以下方式触发此操作:

pkill -HUP daemon_name

但是,在bash上执行此操作时,bash会关闭。它不是守护程序,系统也没有类似的行为。

总而言之,随着时间的流逝,您可能不会经常对bashrc进行更改,因此这不会成为问题。进行更改时,如果需要在运行的Shell中进行更改,则只需重新获得文件源。


2

bash没有内置任何内容。您可以通过告诉它可能在.bashrc每次显示提示时重新加载PROMPT_COMMAND

## Create a timestamp file, dated like the .bashrc that was read.
## There is a small race condition: if .bashrc is modified as the shell is
## just starting, before getting to this line, this instance won't detect
## that modification.
bashrc_timestamp_file=~/.bashrc-timestamp-$$
touch -r ~/.bashrc "$bashrc_timestamp_file"
## Remove the timestamp file on exit. The timestamp file will be left
## behind on a crash.
trap 'rm "$bashrc_timestamp_file"' EXIT HUP TERM INT QUIT
maybe_reload_bashrc () {
  if [[ ~/.bashrc -nt $bashrc_timestamp_file ]]; then
    . ~/.bashrc
  fi
}
if [[ $PROMPT_COMMAND != *maybe_reload_bashrc* ]]; then
  PROMPT_COMMAND="maybe_reload_bashrc
$PROMPT_COMMAND"
fi

额外的文件需要花费很多的麻烦。同样,它对您施加了约束.bashrc:该文件必须是幂等的,即,您必须能够多次加载该文件,而不会产生不良影响。例如,在上面的代码段中,我小心maybe_reload_bashrcPROMPT_COMMAND仅在不存在时才添加。


@Kevin我拒绝了您的编辑,因为尚不清楚额外的代码可能有什么优点/缺点。Gilles可能会产生副作用,他会避免将时间戳记与原始文件已更改相比进行比较,从而避免这样做,并且即使更改了一次,也始终在每个命令上加载。如果您认为确实存在错误,请在此处发表评论,我相信它将得到解决。
Caleb

2
@Caleb:您的评论不会通知Kevin。供参考,建议编辑touch -r ~/.bashrc $bashrc_timestamp_file在采购之后运行~/.bashrc。我实际上差不多写了,但这不是必需的:它只是由源代码完成的.bashrc。每次.bashrc加载时都会更新时间戳文件,而不仅仅是在初始加载时更新。
吉尔(Gilles)“所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.