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

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

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

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

答案1

不,我认为这是不可能的。也不应该如此。这基本上相当于一种将代码注入到已启动且活动的 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_bashrc添加。PROMPT_COMMAND

相关内容