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

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

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

答案1

一种方式,如另一个答案指出,将创建一个函数,用一个两步过程替换编辑器对 .bashrc 的调用

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

例如:

vibashrc() { vi $HOME/.bashrc; source $HOME/.bashrc; }

这有一些缺点:

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

另一种选择是挂钩到 bash提示命令每当看到 .bashrc 文件已更新(并且在显示下一个提示之前)时,在任何/所有 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'

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

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

答案2

也许是一个像这样的 shell 函数:

nano .bashrc ; source .bashrc

或者只是运行该命令?

答案3

你可以指示 bash.bashrc在收到一个信号。将以下行放入您的.bashrc

trap '. ~/.bashrc' USR1

然后,每当您编辑完 后.bashrc,发送交互的bash 信号的实例。 (不要将其发送到脚本!这会杀死它们。)没有万无一失的方法可以做到这一点,因此存在杀死不相关进程的风险。下面的 bash 片段很接近——它查找不带参数且使用来自终端(或任何其他字符设备,但实际上这不是问题)的标准输入调用的 bash:

ps -u "$(id -u)" -o pid= -o args= | while read -r pid args; do
  if [[ $args = bash || $args = */bin/bash ]]; then
    stdin="$(lsof -p"$pid" | sed -n '/^f0$/ { n; s/^n//p; q; }')"
    if [ -c "$stdin" ]; then
      kill -USR1 "$pid"
    fi
  fi
done

或者,为了避免信号方法的不可靠性,您可以让 bash 重新读取.bashrc它自己的违规行为。这种方法的缺点是,即使您刚刚保存文件时出现语法错误或逻辑错误(例如无限循环),它也会重新读取文件。PROMPT_COMMAND每次 bash 显示提示时都会执行该变量的内容,因此请将其放入您的.bashrc

reread_bashrc () {
  if ((SECONDS > bashrc_last_read)); then
    . ~/.bashrc
    bashrc_last_read=$SECONDS
  fi
}
bashrc_last_read=$SECONDS
PROMPT_COMMAND="$PROMPT_COMMAND
reread_bashrc"

这种方法的一个优点是它不会在您键入命令时触发。您至少必须按Enter

答案4

edit_and_source () {
    local tmpfile=$(mktemp)
    trap 'rm -f "$tmpfile"' EXIT RETURN

    cp -p "$1" "$tmpfile"

    while true; do
        command "${EDITOR:-vi}" "$tmpfile"
        bash -n "$tmpfile" && break

        echo 'There were errors. Re-edit?' >&2
        read -p 'Yes/No/Force: '

        case "$REPLY" in
            [Yy]*) continue ;;
            [Ff]*) break    ;;
            *)     return   ;;
        esac
    done

    mv "$tmpfile" "$1"
}

此函数将允许您使用定义的编辑器(或者如果未设置)bash编辑指定的文件,然后获取它。$EDITORvi

$ edit_and_source ~/.bashrc

如果编辑后文件有错误,该函数会询问您是否要再次编辑:

/tmp/tmp.ETdo10orcg: line 4: syntax error near unexpected token `('
/tmp/tmp.ETdo10orcg: line 4: ` nt hn thnt();0'
There were errors. Re-edit?
Yes/No/Force: n

回答“否”将使原始文件保持不变。回答“force”(或任何以“f”开头的单词)将强制安装有问题的文件。

相关内容