编辑并保存后如何自动运行“source .bashrc”?

use*_*571 4 bash monitoring configuration

每次编辑 bashrc 文件并保存时,是否可以自动运行“source .bashrc”?

Jef*_*ler 5

正如另一个答案所指出的那样,一种方法是创建一个函数,用一个两步过程替换您对 .bashrc 的编辑器调用

  1. 在 .bashrc 上打开你的编辑器
  2. 源.bashrc

如:

vibashrc() { vi $HOME/.bashrc; source $HOME/.bashrc; }
Run Code Online (Sandbox Code Playgroud)

这有一些缺点:

  • 它需要你记住vibashrc每次你想要采购发生时都打字
  • 它只会发生在您当前的 bash 窗口中
  • 无论您是否对其进行了任何更改,它都会尝试获取 .bashrc

另一个选择是,只要看到 .bashrc 文件已更新(并且就在显示下一个提示之前),就挂钩到 bash 的PROMPT_COMMAND功能以在任何/所有 bash shell 中获取 .bashrc 的源。

您可以将以下代码添加到 .bashrc 文件中(或使用它扩展任何现有的 PROMPT_COMMAND 功能):

prompt_command() {
  # initialize the timestamp, if it isn't already
  _bashrc_timestamp=${_bashrc_timestamp:-$(stat -c %Y "$HOME/.bashrc")}
  # if it's been modified, test and load it
  if [[ $(stat -c %Y "$HOME/.bashrc") -gt $_bashrc_timestamp ]]
  then
    # only load it if `-n` succeeds ...
    if $BASH -n "$HOME/.bashrc" >& /dev/null
    then
        source "$HOME/.bashrc"
    else
        printf "Error in $HOME/.bashrc; not sourcing it\n" >&2
    fi
    # ... but update the timestamp regardless
    _bashrc_timestamp=$(stat -c %Y "$HOME/.bashrc")
  fi
}

PROMPT_COMMAND='prompt_command'
Run Code Online (Sandbox Code Playgroud)

然后,下次登录时,bash 会加载这个函数和提示钩子,每次即将显示提示时,它会检查 $HOME/.bashrc 是否已更新。如果有,它会快速检查语法错误(set -n选项),如果文件是干净的,源它。

无论语法检查如何,它都会更新内部时间戳变量,以便在文件再次保存/更新之前不会尝试加载它。